blob: 09dc92c8fa46dd524b535085825d2c0b8b2bb7e3 [file] [log] [blame]
Garfield Tane84e6f92019-08-29 17:28:41 -07001/*
2 * Copyright (C) 2019 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_INPUTDISPATCHER_INPUTDISPATCHERINTERFACE_H
18#define _UI_INPUT_INPUTDISPATCHER_INPUTDISPATCHERINTERFACE_H
19
20#include <InputListener.h>
21#include <input/ISetInputWindowsListener.h>
Arthur Hung72d8dc32020-03-28 00:48:39 +000022#include <unordered_map>
Garfield Tane84e6f92019-08-29 17:28:41 -070023
24namespace android {
25
26class InputApplicationHandle;
27class InputChannel;
28class InputWindowHandle;
29
30/*
31 * Constants used to report the outcome of input event injection.
32 */
33enum {
34 /* (INTERNAL USE ONLY) Specifies that injection is pending and its outcome is unknown. */
35 INPUT_EVENT_INJECTION_PENDING = -1,
36
37 /* Injection succeeded. */
38 INPUT_EVENT_INJECTION_SUCCEEDED = 0,
39
40 /* Injection failed because the injector did not have permission to inject
41 * into the application with input focus. */
42 INPUT_EVENT_INJECTION_PERMISSION_DENIED = 1,
43
44 /* Injection failed because there were no available input targets. */
45 INPUT_EVENT_INJECTION_FAILED = 2,
46
47 /* Injection failed due to a timeout. */
48 INPUT_EVENT_INJECTION_TIMED_OUT = 3
49};
50
51/* Notifies the system about input events generated by the input reader.
52 * The dispatcher is expected to be mostly asynchronous. */
53class InputDispatcherInterface : public virtual RefBase, public InputListenerInterface {
54protected:
55 InputDispatcherInterface() {}
56 virtual ~InputDispatcherInterface() {}
57
58public:
59 /* Dumps the state of the input dispatcher.
60 *
61 * This method may be called on any thread (usually by the input manager). */
62 virtual void dump(std::string& dump) = 0;
63
64 /* Called by the heatbeat to ensures that the dispatcher has not deadlocked. */
65 virtual void monitor() = 0;
66
Siarhei Vishniakou2bfa9052019-11-21 18:10:54 -080067 /**
68 * Wait until dispatcher is idle. That means, there are no further events to be processed,
69 * and all of the policy callbacks have been completed.
70 * Return true if the dispatcher is idle.
71 * Return false if the timeout waiting for the dispatcher to become idle has expired.
72 */
73 virtual bool waitForIdle() = 0;
74
Prabir Pradhan3608aad2019-10-02 17:08:26 -070075 /* Make the dispatcher start processing events.
Garfield Tane84e6f92019-08-29 17:28:41 -070076 *
Prabir Pradhan3608aad2019-10-02 17:08:26 -070077 * The dispatcher will start consuming events from the InputListenerInterface
78 * in the order that they were received.
Garfield Tane84e6f92019-08-29 17:28:41 -070079 */
Prabir Pradhan3608aad2019-10-02 17:08:26 -070080 virtual status_t start() = 0;
81
82 /* Makes the dispatcher stop processing events. */
83 virtual status_t stop() = 0;
Garfield Tane84e6f92019-08-29 17:28:41 -070084
85 /* Injects an input event and optionally waits for sync.
86 * The synchronization mode determines whether the method blocks while waiting for
87 * input injection to proceed.
88 * Returns one of the INPUT_EVENT_INJECTION_XXX constants.
89 *
90 * This method may be called on any thread (usually by the input manager).
91 */
92 virtual int32_t injectInputEvent(const InputEvent* event, int32_t injectorPid,
93 int32_t injectorUid, int32_t syncMode, int32_t timeoutMillis,
94 uint32_t policyFlags) = 0;
95
Siarhei Vishniakou54d3e182020-01-15 17:38:38 -080096 /*
97 * Check whether InputEvent actually happened by checking the signature of the event.
98 *
99 * Return nullptr if the event cannot be verified.
100 */
101 virtual std::unique_ptr<VerifiedInputEvent> verifyInputEvent(const InputEvent& event) = 0;
102
Arthur Hung72d8dc32020-03-28 00:48:39 +0000103 /* Sets the list of input windows per display.
Garfield Tane84e6f92019-08-29 17:28:41 -0700104 *
105 * This method may be called on any thread (usually by the input manager).
106 */
107 virtual void setInputWindows(
Arthur Hung72d8dc32020-03-28 00:48:39 +0000108 const std::unordered_map<int32_t, std::vector<sp<InputWindowHandle>>>&
109 handlesPerDisplay) = 0;
Garfield Tane84e6f92019-08-29 17:28:41 -0700110
111 /* Sets the focused application on the given display.
112 *
113 * This method may be called on any thread (usually by the input manager).
114 */
115 virtual void setFocusedApplication(
116 int32_t displayId, const sp<InputApplicationHandle>& inputApplicationHandle) = 0;
117
118 /* Sets the focused display.
119 *
120 * This method may be called on any thread (usually by the input manager).
121 */
122 virtual void setFocusedDisplay(int32_t displayId) = 0;
123
124 /* Sets the input dispatching mode.
125 *
126 * This method may be called on any thread (usually by the input manager).
127 */
128 virtual void setInputDispatchMode(bool enabled, bool frozen) = 0;
129
130 /* Sets whether input event filtering is enabled.
131 * When enabled, incoming input events are sent to the policy's filterInputEvent
132 * method instead of being dispatched. The filter is expected to use
133 * injectInputEvent to inject the events it would like to have dispatched.
134 * It should include POLICY_FLAG_FILTERED in the policy flags during injection.
135 */
136 virtual void setInputFilterEnabled(bool enabled) = 0;
137
Siarhei Vishniakouf3bc1aa2019-11-25 13:48:53 -0800138 /**
139 * Set the touch mode state.
140 * Touch mode is a global state that apps may enter / exit based on specific
141 * user interactions with input devices.
142 * If true, the device is in touch mode.
143 */
144 virtual void setInTouchMode(bool inTouchMode) = 0;
145
Garfield Tane84e6f92019-08-29 17:28:41 -0700146 /* Transfers touch focus from one window to another window.
147 *
148 * Returns true on success. False if the window did not actually have touch focus.
149 */
150 virtual bool transferTouchFocus(const sp<IBinder>& fromToken, const sp<IBinder>& toToken) = 0;
151
152 /* Registers input channels that may be used as targets for input events.
153 *
154 * This method may be called on any thread (usually by the input manager).
155 */
Siarhei Vishniakou7c34b232019-10-11 19:08:48 -0700156 virtual status_t registerInputChannel(const sp<InputChannel>& inputChannel) = 0;
Garfield Tane84e6f92019-08-29 17:28:41 -0700157
158 /* Registers input channels to be used to monitor input events.
159 *
160 * Each monitor must target a specific display and will only receive input events sent to that
161 * display. If the monitor is a gesture monitor, it will only receive pointer events on the
162 * targeted display.
163 *
164 * This method may be called on any thread (usually by the input manager).
165 */
166 virtual status_t registerInputMonitor(const sp<InputChannel>& inputChannel, int32_t displayId,
167 bool gestureMonitor) = 0;
168
169 /* Unregister input channels that will no longer receive input events.
170 *
171 * This method may be called on any thread (usually by the input manager).
172 */
173 virtual status_t unregisterInputChannel(const sp<InputChannel>& inputChannel) = 0;
174
175 /* Allows an input monitor steal the current pointer stream away from normal input windows.
176 *
177 * This method may be called on any thread (usually by the input manager).
178 */
179 virtual status_t pilferPointers(const sp<IBinder>& token) = 0;
180};
181
182} // namespace android
183
184#endif // _UI_INPUT_INPUTDISPATCHER_INPUTDISPATCHERINTERFACE_H