// // Copyright 2010 The Android Open Source Project // // The input manager. // #define LOG_TAG "InputManager" //#define LOG_NDEBUG 0 #include #include #include #include namespace android { InputManager::InputManager(const sp& eventHub, const sp& policy) : mEventHub(eventHub), mPolicy(policy) { mDispatcher = new InputDispatcher(policy); mReader = new InputReader(eventHub, policy, mDispatcher); mDispatcherThread = new InputDispatcherThread(mDispatcher); mReaderThread = new InputReaderThread(mReader); configureExcludedDevices(); } InputManager::~InputManager() { stop(); } void InputManager::configureExcludedDevices() { Vector excludedDeviceNames; mPolicy->getExcludedDeviceNames(excludedDeviceNames); for (size_t i = 0; i < excludedDeviceNames.size(); i++) { mEventHub->addExcludedDevice(excludedDeviceNames[i]); } } status_t InputManager::start() { status_t result = mDispatcherThread->run("InputDispatcher", PRIORITY_URGENT_DISPLAY); if (result) { LOGE("Could not start InputDispatcher thread due to error %d.", result); return result; } result = mReaderThread->run("InputReader", PRIORITY_URGENT_DISPLAY); if (result) { LOGE("Could not start InputReader thread due to error %d.", result); mDispatcherThread->requestExit(); return result; } return OK; } status_t InputManager::stop() { status_t result = mReaderThread->requestExitAndWait(); if (result) { LOGW("Could not stop InputReader thread due to error %d.", result); } result = mDispatcherThread->requestExitAndWait(); if (result) { LOGW("Could not stop InputDispatcher thread due to error %d.", result); } return OK; } status_t InputManager::registerInputChannel(const sp& inputChannel) { return mDispatcher->registerInputChannel(inputChannel); } status_t InputManager::unregisterInputChannel(const sp& inputChannel) { return mDispatcher->unregisterInputChannel(inputChannel); } int32_t InputManager::getScanCodeState(int32_t deviceId, int32_t deviceClasses, int32_t scanCode) const { int32_t vkKeyCode, vkScanCode; if (mReader->getCurrentVirtualKey(& vkKeyCode, & vkScanCode)) { if (vkScanCode == scanCode) { return KEY_STATE_VIRTUAL; } } return mEventHub->getScanCodeState(deviceId, deviceClasses, scanCode); } int32_t InputManager::getKeyCodeState(int32_t deviceId, int32_t deviceClasses, int32_t keyCode) const { int32_t vkKeyCode, vkScanCode; if (mReader->getCurrentVirtualKey(& vkKeyCode, & vkScanCode)) { if (vkKeyCode == keyCode) { return KEY_STATE_VIRTUAL; } } return mEventHub->getKeyCodeState(deviceId, deviceClasses, keyCode); } int32_t InputManager::getSwitchState(int32_t deviceId, int32_t deviceClasses, int32_t sw) const { return mEventHub->getSwitchState(deviceId, deviceClasses, sw); } bool InputManager::hasKeys(size_t numCodes, const int32_t* keyCodes, uint8_t* outFlags) const { return mEventHub->hasKeys(numCodes, keyCodes, outFlags); } } // namespace android