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#define LOG_TAG "InputManager"
18d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
19d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright//#define LOG_NDEBUG 0
20d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
21d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright#include "InputManager.h"
22d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
23d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright#include <cutils/log.h>
24d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
25d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightnamespace android {
26d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
27d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael WrightInputManager::InputManager(
28d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        const sp<EventHubInterface>& eventHub,
29d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        const sp<InputReaderPolicyInterface>& readerPolicy,
30d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        const sp<InputDispatcherPolicyInterface>& dispatcherPolicy) {
31d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    mDispatcher = new InputDispatcher(dispatcherPolicy);
32d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    mReader = new InputReader(eventHub, readerPolicy, mDispatcher);
33d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    initialize();
34d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright}
35d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
36d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael WrightInputManager::InputManager(
37d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        const sp<InputReaderInterface>& reader,
38d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        const sp<InputDispatcherInterface>& dispatcher) :
39d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        mReader(reader),
40d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        mDispatcher(dispatcher) {
41d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    initialize();
42d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright}
43d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
44d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael WrightInputManager::~InputManager() {
45d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    stop();
46d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright}
47d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
48d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightvoid InputManager::initialize() {
49d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    mReaderThread = new InputReaderThread(mReader);
50d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    mDispatcherThread = new InputDispatcherThread(mDispatcher);
51d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright}
52d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
53d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightstatus_t InputManager::start() {
54d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    status_t result = mDispatcherThread->run("InputDispatcher", PRIORITY_URGENT_DISPLAY);
55d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    if (result) {
56d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        ALOGE("Could not start InputDispatcher thread due to error %d.", result);
57d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        return result;
58d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    }
59d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
60d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    result = mReaderThread->run("InputReader", PRIORITY_URGENT_DISPLAY);
61d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    if (result) {
62d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        ALOGE("Could not start InputReader thread due to error %d.", result);
63d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
64d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        mDispatcherThread->requestExit();
65d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        return result;
66d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    }
67d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
68d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    return OK;
69d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright}
70d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
71d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightstatus_t InputManager::stop() {
72d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    status_t result = mReaderThread->requestExitAndWait();
73d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    if (result) {
74d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        ALOGW("Could not stop InputReader thread due to error %d.", result);
75d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    }
76d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
77d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    result = mDispatcherThread->requestExitAndWait();
78d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    if (result) {
79d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        ALOGW("Could not stop InputDispatcher thread due to error %d.", result);
80d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    }
81d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
82d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    return OK;
83d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright}
84d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
85d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightsp<InputReaderInterface> InputManager::getReader() {
86d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    return mReader;
87d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright}
88d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
89d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightsp<InputDispatcherInterface> InputManager::getDispatcher() {
90d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    return mDispatcher;
91d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright}
92d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
93d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright} // namespace android
94