1b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown/*
2b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown * Copyright (C) 2010 The Android Open Source Project
3b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown *
4b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown * Licensed under the Apache License, Version 2.0 (the "License");
5b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown * you may not use this file except in compliance with the License.
6b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown * You may obtain a copy of the License at
7b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown *
8b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown *      http://www.apache.org/licenses/LICENSE-2.0
9b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown *
10b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown * Unless required by applicable law or agreed to in writing, software
11b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown * distributed under the License is distributed on an "AS IS" BASIS,
12b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown * See the License for the specific language governing permissions and
14b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown * limitations under the License.
15b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown */
16b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown
1746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#define LOG_TAG "InputManager"
1846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
1946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown//#define LOG_NDEBUG 0
2046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
21b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown#include "InputManager.h"
22b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown
2346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include <cutils/log.h>
2446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
2546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownnamespace android {
2646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
279c3cda04d969912bc46184f2b326d1db95e0aba5Jeff BrownInputManager::InputManager(
289c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown        const sp<EventHubInterface>& eventHub,
299c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown        const sp<InputReaderPolicyInterface>& readerPolicy,
309c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown        const sp<InputDispatcherPolicyInterface>& dispatcherPolicy) {
319c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    mDispatcher = new InputDispatcher(dispatcherPolicy);
329c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    mReader = new InputReader(eventHub, readerPolicy, mDispatcher);
339c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    initialize();
349c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown}
3546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
369c3cda04d969912bc46184f2b326d1db95e0aba5Jeff BrownInputManager::InputManager(
379c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown        const sp<InputReaderInterface>& reader,
389c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown        const sp<InputDispatcherInterface>& dispatcher) :
399c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown        mReader(reader),
409c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown        mDispatcher(dispatcher) {
419c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    initialize();
4246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
4346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
4446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff BrownInputManager::~InputManager() {
4546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    stop();
4646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
4746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
489c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brownvoid InputManager::initialize() {
499c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    mReaderThread = new InputReaderThread(mReader);
509c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    mDispatcherThread = new InputDispatcherThread(mDispatcher);
5146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
5246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
5346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownstatus_t InputManager::start() {
5446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    status_t result = mDispatcherThread->run("InputDispatcher", PRIORITY_URGENT_DISPLAY);
5546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    if (result) {
563762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("Could not start InputDispatcher thread due to error %d.", result);
5746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        return result;
5846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    }
5946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
6046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    result = mReaderThread->run("InputReader", PRIORITY_URGENT_DISPLAY);
6146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    if (result) {
623762c311729fe9f3af085c14c5c1fb471d994c03Steve Block        ALOGE("Could not start InputReader thread due to error %d.", result);
6346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
6446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        mDispatcherThread->requestExit();
6546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown        return result;
6646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    }
6746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
6846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    return OK;
6946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
7046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
7146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownstatus_t InputManager::stop() {
7246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    status_t result = mReaderThread->requestExitAndWait();
7346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    if (result) {
748564c8da817a845353d213acd8636b76f567b234Steve Block        ALOGW("Could not stop InputReader thread due to error %d.", result);
7546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    }
7646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
7746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    result = mDispatcherThread->requestExitAndWait();
7846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    if (result) {
798564c8da817a845353d213acd8636b76f567b234Steve Block        ALOGW("Could not stop InputDispatcher thread due to error %d.", result);
8046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    }
8146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
8246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    return OK;
8346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
8446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
85b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownsp<InputReaderInterface> InputManager::getReader() {
86b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    return mReader;
8746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
8846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
89b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brownsp<InputDispatcherInterface> InputManager::getDispatcher() {
90b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    return mDispatcher;
9146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
9246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
9346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} // namespace android
94