InputManager.h revision 9c3cda04d969912bc46184f2b326d1db95e0aba5
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
7546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    /* Registers an input channel prior to using it as the target of an event. */
7646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    virtual status_t registerInputChannel(const sp<InputChannel>& inputChannel) = 0;
7746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
7846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    /* Unregisters an input channel. */
7946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    virtual status_t unregisterInputChannel(const sp<InputChannel>& inputChannel) = 0;
8046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
819c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    /* Gets input device configuration. */
829c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    virtual void getInputConfiguration(InputConfiguration* outConfiguration) const = 0;
839c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
8446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    /*
859c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown     * Queries current input state.
8646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown     *   deviceId may be -1 to search for the device automatically, filtered by class.
8746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown     *   deviceClasses may be -1 to ignore device class while searching.
8846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown     */
8946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    virtual int32_t getScanCodeState(int32_t deviceId, int32_t deviceClasses,
9046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            int32_t scanCode) const = 0;
9146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    virtual int32_t getKeyCodeState(int32_t deviceId, int32_t deviceClasses,
9246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            int32_t keyCode) const = 0;
9346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    virtual int32_t getSwitchState(int32_t deviceId, int32_t deviceClasses,
9446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            int32_t sw) const = 0;
9546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
969c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    /* Determines whether physical keys exist for the given framework-domain key codes. */
9746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    virtual bool hasKeys(size_t numCodes, const int32_t* keyCodes, uint8_t* outFlags) const = 0;
9846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown};
9946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
10046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownclass InputManager : public InputManagerInterface {
10146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownprotected:
10246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    virtual ~InputManager();
10346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
10446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownpublic:
1059c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    InputManager(
1069c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown            const sp<EventHubInterface>& eventHub,
1079c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown            const sp<InputReaderPolicyInterface>& readerPolicy,
1089c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown            const sp<InputDispatcherPolicyInterface>& dispatcherPolicy);
1099c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown
1109c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    // (used for testing purposes)
1119c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    InputManager(
1129c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown            const sp<InputReaderInterface>& reader,
1139c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown            const sp<InputDispatcherInterface>& dispatcher);
11446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
11546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    virtual status_t start();
11646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    virtual status_t stop();
11746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
11846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    virtual status_t registerInputChannel(const sp<InputChannel>& inputChannel);
11946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    virtual status_t unregisterInputChannel(const sp<InputChannel>& inputChannel);
12046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
1219c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    virtual void getInputConfiguration(InputConfiguration* outConfiguration) const;
12246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    virtual int32_t getScanCodeState(int32_t deviceId, int32_t deviceClasses,
12346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            int32_t scanCode) const;
12446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    virtual int32_t getKeyCodeState(int32_t deviceId, int32_t deviceClasses,
12546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            int32_t keyCode) const;
12646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    virtual int32_t getSwitchState(int32_t deviceId, int32_t deviceClasses,
12746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown            int32_t sw) const;
12846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    virtual bool hasKeys(size_t numCodes, const int32_t* keyCodes, uint8_t* outFlags) const;
12946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
13046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownprivate:
1319c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    sp<InputReaderInterface> mReader;
1329c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    sp<InputReaderThread> mReaderThread;
13346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
1349c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    sp<InputDispatcherInterface> mDispatcher;
13546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown    sp<InputDispatcherThread> mDispatcherThread;
13646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
1379c3cda04d969912bc46184f2b326d1db95e0aba5Jeff Brown    void initialize();
13846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown};
13946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
14046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} // namespace android
14146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
14246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#endif // _UI_INPUT_MANAGER_H
143