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
24b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown#include "EventHub.h"
25b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown#include "InputReader.h"
26b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown#include "InputDispatcher.h"
27b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown
28b93a03f841d93498bfea6cc92a22faa34bce1337Mathias Agopian#include <androidfw/Input.h>
29b93a03f841d93498bfea6cc92a22faa34bce1337Mathias Agopian#include <androidfw/InputTransport.h>
3046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include <utils/Errors.h>
3146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include <utils/Vector.h>
3246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include <utils/Timers.h>
3346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include <utils/RefBase.h>
3446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include <utils/String8.h>
3546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
3646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownnamespace android {
3746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
3846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown/*
3946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * The input manager is the core of the system event processing.
4046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown *
4146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * The input manager uses two threads.
4246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown *
4346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * 1. The InputReaderThread (called "InputReader") reads and preprocesses raw input events,
4446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown *    applies policy, and posts messages to a queue managed by the DispatcherThread.
4546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * 2. The InputDispatcherThread (called "InputDispatcher") thread waits for new events on the
4646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown *    queue and asynchronously dispatches them to applications.
4746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown *
4846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * By design, the InputReaderThread class and InputDispatcherThread class do not share any
4946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * internal state.  Moreover, all communication is done one way from the InputReaderThread
5046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * into the InputDispatcherThread and never the reverse.  Both classes may interact with the
5146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * InputDispatchPolicy, however.
5246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown *
5346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * The InputManager class never makes any calls into Java itself.  Instead, the
5446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * InputDispatchPolicy is responsible for performing all external interactions with the
5546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown * system, including calling DVM services.
5646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown */
5746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownclass InputManagerInterface : public virtual RefBase {
5846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownprotected:
5946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    InputManagerInterface() { }
6046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    virtual ~InputManagerInterface() { }
6146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
6246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownpublic:
6346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    /* Starts the input manager threads. */
6446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    virtual status_t start() = 0;
6546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
6646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    /* Stops the input manager threads and waits for them to exit. */
6746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    virtual status_t stop() = 0;
6846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
69b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    /* Gets the input reader. */
70b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    virtual sp<InputReaderInterface> getReader() = 0;
71b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
72b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    /* Gets the input dispatcher. */
73b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    virtual sp<InputDispatcherInterface> getDispatcher() = 0;
7446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown};
7546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
7646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownclass InputManager : public InputManagerInterface {
7746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownprotected:
7846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    virtual ~InputManager();
7946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
8046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownpublic:
819c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    InputManager(
829c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown            const sp<EventHubInterface>& eventHub,
839c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown            const sp<InputReaderPolicyInterface>& readerPolicy,
849c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown            const sp<InputDispatcherPolicyInterface>& dispatcherPolicy);
859c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
869c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    // (used for testing purposes)
879c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    InputManager(
889c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown            const sp<InputReaderInterface>& reader,
899c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown            const sp<InputDispatcherInterface>& dispatcher);
9046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
9146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    virtual status_t start();
9246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    virtual status_t stop();
9346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
94b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    virtual sp<InputReaderInterface> getReader();
95b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    virtual sp<InputDispatcherInterface> getDispatcher();
9646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
9746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownprivate:
989c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    sp<InputReaderInterface> mReader;
999c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    sp<InputReaderThread> mReaderThread;
10046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
1019c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    sp<InputDispatcherInterface> mDispatcher;
10246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    sp<InputDispatcherThread> mDispatcherThread;
10346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
1049c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    void initialize();
10546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown};
10646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
10746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} // namespace android
10846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
10946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#endif // _UI_INPUT_MANAGER_H
110