InputManager.h revision b88102f5b7e51552a3576cf197b4c8cf96f193d1
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
75b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    /* Gets the input reader. */
76b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    virtual sp<InputReaderInterface> getReader() = 0;
77b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown
78b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    /* Gets the input dispatcher. */
79b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    virtual sp<InputDispatcherInterface> getDispatcher() = 0;
8046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown};
8146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
8246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownclass InputManager : public InputManagerInterface {
8346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownprotected:
8446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    virtual ~InputManager();
8546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
8646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownpublic:
879c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    InputManager(
889c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown            const sp<EventHubInterface>& eventHub,
899c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown            const sp<InputReaderPolicyInterface>& readerPolicy,
909c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown            const sp<InputDispatcherPolicyInterface>& dispatcherPolicy);
919c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
929c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    // (used for testing purposes)
939c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    InputManager(
949c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown            const sp<InputReaderInterface>& reader,
959c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown            const sp<InputDispatcherInterface>& dispatcher);
9646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
9746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    virtual status_t start();
9846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    virtual status_t stop();
9946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
100b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    virtual sp<InputReaderInterface> getReader();
101b88102f5b7e51552a3576cf197b4c8cf96f193d1Jeff Brown    virtual sp<InputDispatcherInterface> getDispatcher();
10246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
10346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownprivate:
1049c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    sp<InputReaderInterface> mReader;
1059c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    sp<InputReaderThread> mReaderThread;
10646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
1079c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    sp<InputDispatcherInterface> mDispatcher;
10846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    sp<InputDispatcherThread> mDispatcherThread;
10946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
1109c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    void initialize();
11146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown};
11246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
11346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} // namespace android
11446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
11546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#endif // _UI_INPUT_MANAGER_H
116