• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2010 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef _UI_INPUT_MANAGER_H
18 #define _UI_INPUT_MANAGER_H
19 
20 /**
21  * Native input manager.
22  */
23 
24 #include "InputClassifier.h"
25 #include "InputReaderBase.h"
26 
27 #include <InputDispatcherInterface.h>
28 #include <InputDispatcherPolicyInterface.h>
29 #include <android/os/ISetInputWindowsListener.h>
30 #include <input/Input.h>
31 #include <input/InputTransport.h>
32 
33 #include <android/os/BnInputFlinger.h>
34 #include <android/os/IInputFlinger.h>
35 #include <utils/Errors.h>
36 #include <utils/RefBase.h>
37 #include <utils/Timers.h>
38 #include <utils/Vector.h>
39 
40 using android::os::BnInputFlinger;
41 using android::os::ISetInputWindowsListener;
42 
43 namespace android {
44 class InputChannel;
45 class InputDispatcherThread;
46 
47 /*
48  * The input manager is the core of the system event processing.
49  *
50  * The input manager has three components.
51  *
52  * 1. The InputReader class starts a thread that reads and preprocesses raw input events, applies
53  *    policy, and posts messages to a queue managed by the InputClassifier.
54  * 2. The InputClassifier class starts a thread to communicate with the device-specific
55  *    classifiers. It then waits on the queue of events from InputReader, applies a classification
56  *    to them, and queues them for the InputDispatcher.
57  * 3. The InputDispatcher class starts a thread that waits for new events on the
58  *    previous queue and asynchronously dispatches them to applications.
59  *
60  * By design, none of these classes share any internal state.  Moreover, all communication is
61  * done one way from the InputReader to the InputDispatcher and never the reverse.  All
62  * classes may interact with the InputDispatchPolicy, however.
63  *
64  * The InputManager class never makes any calls into Java itself.  Instead, the
65  * InputDispatchPolicy is responsible for performing all external interactions with the
66  * system, including calling DVM services.
67  */
68 class InputManagerInterface : public virtual RefBase {
69 protected:
InputManagerInterface()70     InputManagerInterface() { }
~InputManagerInterface()71     virtual ~InputManagerInterface() { }
72 
73 public:
74     /* Starts the input threads. */
75     virtual status_t start() = 0;
76 
77     /* Stops the input threads and waits for them to exit. */
78     virtual status_t stop() = 0;
79 
80     /* Gets the input reader. */
81     virtual sp<InputReaderInterface> getReader() = 0;
82 
83     /* Gets the input classifier */
84     virtual sp<InputClassifierInterface> getClassifier() = 0;
85 
86     /* Gets the input dispatcher. */
87     virtual sp<InputDispatcherInterface> getDispatcher() = 0;
88 };
89 
90 class InputManager : public InputManagerInterface, public BnInputFlinger {
91 protected:
92     ~InputManager() override;
93 
94 public:
95     InputManager(
96             const sp<InputReaderPolicyInterface>& readerPolicy,
97             const sp<InputDispatcherPolicyInterface>& dispatcherPolicy);
98 
99     status_t start() override;
100     status_t stop() override;
101 
102     sp<InputReaderInterface> getReader() override;
103     sp<InputClassifierInterface> getClassifier() override;
104     sp<InputDispatcherInterface> getDispatcher() override;
105 
106     status_t dump(int fd, const Vector<String16>& args) override;
107     binder::Status setInputWindows(
108             const std::vector<InputWindowInfo>& handles,
109             const sp<ISetInputWindowsListener>& setInputWindowsListener) override;
110 
111     binder::Status createInputChannel(const std::string& name, InputChannel* outChannel) override;
112     binder::Status removeInputChannel(const sp<IBinder>& connectionToken) override;
113     binder::Status setFocusedWindow(const FocusRequest&) override;
114 
115 private:
116     sp<InputReaderInterface> mReader;
117 
118     sp<InputClassifierInterface> mClassifier;
119 
120     sp<InputDispatcherInterface> mDispatcher;
121 };
122 
123 } // namespace android
124 
125 #endif // _UI_INPUT_MANAGER_H
126