InputManager.h revision 9c3cda04d969912bc46184f2b326d1db95e0aba5
146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown/* 246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * Copyright (C) 2010 The Android Open Source Project 346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * 446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * Licensed under the Apache License, Version 2.0 (the "License"); 546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * you may not use this file except in compliance with the License. 646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * You may obtain a copy of the License at 746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * 846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * http://www.apache.org/licenses/LICENSE-2.0 946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * 1046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * Unless required by applicable law or agreed to in writing, software 1146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * distributed under the License is distributed on an "AS IS" BASIS, 1246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * See the License for the specific language governing permissions and 1446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * limitations under the License. 1546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown */ 1646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 1746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#ifndef _UI_INPUT_MANAGER_H 1846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#define _UI_INPUT_MANAGER_H 1946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 2046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown/** 2146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * Native input manager. 2246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown */ 2346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 2446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include <ui/EventHub.h> 2546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include <ui/Input.h> 2646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include <utils/Errors.h> 2746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include <utils/Vector.h> 2846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include <utils/Timers.h> 2946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include <utils/RefBase.h> 3046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include <utils/String8.h> 3146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 3246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownnamespace android { 3346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 349c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brownclass InputChannel; 359c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 369c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brownclass InputReaderInterface; 379c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brownclass InputReaderPolicyInterface; 3846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownclass InputReaderThread; 399c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 409c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brownclass InputDispatcherInterface; 419c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brownclass InputDispatcherPolicyInterface; 4246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownclass InputDispatcherThread; 4346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 4446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown/* 4546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * The input manager is the core of the system event processing. 4646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * 4746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * The input manager uses two threads. 4846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * 4946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * 1. The InputReaderThread (called "InputReader") reads and preprocesses raw input events, 5046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * applies policy, and posts messages to a queue managed by the DispatcherThread. 5146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * 2. The InputDispatcherThread (called "InputDispatcher") thread waits for new events on the 5246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * queue and asynchronously dispatches them to applications. 5346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * 5446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * By design, the InputReaderThread class and InputDispatcherThread class do not share any 5546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * internal state. Moreover, all communication is done one way from the InputReaderThread 5646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * into the InputDispatcherThread and never the reverse. Both classes may interact with the 5746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * InputDispatchPolicy, however. 5846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * 5946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * The InputManager class never makes any calls into Java itself. Instead, the 6046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * InputDispatchPolicy is responsible for performing all external interactions with the 6146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * system, including calling DVM services. 6246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown */ 6346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownclass InputManagerInterface : public virtual RefBase { 6446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownprotected: 6546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown InputManagerInterface() { } 6646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown virtual ~InputManagerInterface() { } 6746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 6846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownpublic: 6946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown /* Starts the input manager threads. */ 7046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown virtual status_t start() = 0; 7146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 7246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown /* Stops the input manager threads and waits for them to exit. */ 7346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown virtual status_t stop() = 0; 7446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 7546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown /* Registers an input channel prior to using it as the target of an event. */ 7646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown virtual status_t registerInputChannel(const sp<InputChannel>& inputChannel) = 0; 7746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 7846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown /* Unregisters an input channel. */ 7946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown virtual status_t unregisterInputChannel(const sp<InputChannel>& inputChannel) = 0; 8046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 819c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown /* Gets input device configuration. */ 829c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown virtual void getInputConfiguration(InputConfiguration* outConfiguration) const = 0; 839c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 8446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown /* 859c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown * Queries current input state. 8646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * deviceId may be -1 to search for the device automatically, filtered by class. 8746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * deviceClasses may be -1 to ignore device class while searching. 8846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown */ 8946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown virtual int32_t getScanCodeState(int32_t deviceId, int32_t deviceClasses, 9046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown int32_t scanCode) const = 0; 9146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown virtual int32_t getKeyCodeState(int32_t deviceId, int32_t deviceClasses, 9246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown int32_t keyCode) const = 0; 9346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown virtual int32_t getSwitchState(int32_t deviceId, int32_t deviceClasses, 9446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown int32_t sw) const = 0; 9546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 969c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown /* Determines whether physical keys exist for the given framework-domain key codes. */ 9746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown virtual bool hasKeys(size_t numCodes, const int32_t* keyCodes, uint8_t* outFlags) const = 0; 9846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}; 9946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 10046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownclass InputManager : public InputManagerInterface { 10146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownprotected: 10246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown virtual ~InputManager(); 10346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 10446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownpublic: 1059c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown InputManager( 1069c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown const sp<EventHubInterface>& eventHub, 1079c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown const sp<InputReaderPolicyInterface>& readerPolicy, 1089c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown const sp<InputDispatcherPolicyInterface>& dispatcherPolicy); 1099c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown 1109c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown // (used for testing purposes) 1119c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown InputManager( 1129c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown const sp<InputReaderInterface>& reader, 1139c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown const sp<InputDispatcherInterface>& dispatcher); 11446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 11546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown virtual status_t start(); 11646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown virtual status_t stop(); 11746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 11846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown virtual status_t registerInputChannel(const sp<InputChannel>& inputChannel); 11946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown virtual status_t unregisterInputChannel(const sp<InputChannel>& inputChannel); 12046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 1219c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown virtual void getInputConfiguration(InputConfiguration* outConfiguration) const; 12246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown virtual int32_t getScanCodeState(int32_t deviceId, int32_t deviceClasses, 12346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown int32_t scanCode) const; 12446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown virtual int32_t getKeyCodeState(int32_t deviceId, int32_t deviceClasses, 12546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown int32_t keyCode) const; 12646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown virtual int32_t getSwitchState(int32_t deviceId, int32_t deviceClasses, 12746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown int32_t sw) const; 12846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown virtual bool hasKeys(size_t numCodes, const int32_t* keyCodes, uint8_t* outFlags) const; 12946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 13046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownprivate: 1319c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown sp<InputReaderInterface> mReader; 1329c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown sp<InputReaderThread> mReaderThread; 13346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 1349c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown sp<InputDispatcherInterface> mDispatcher; 13546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown sp<InputDispatcherThread> mDispatcherThread; 13646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 1379c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown void initialize(); 13846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}; 13946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 14046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} // namespace android 14146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown 14246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#endif // _UI_INPUT_MANAGER_H 143