1 /* 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 <android-base/result.h> 22 #include <android/FocusRequest.h> 23 #include <android/os/BlockUntrustedTouchesMode.h> 24 #include <android/os/ISetInputWindowsListener.h> 25 #include <android/os/InputEventInjectionResult.h> 26 #include <android/os/InputEventInjectionSync.h> 27 #include <input/InputApplication.h> 28 #include <input/InputDevice.h> 29 #include <input/InputTransport.h> 30 #include <input/InputWindow.h> 31 #include <unordered_map> 32 33 34 namespace android { 35 36 /* Notifies the system about input events generated by the input reader. 37 * The dispatcher is expected to be mostly asynchronous. */ 38 class InputDispatcherInterface : public virtual RefBase, public InputListenerInterface { 39 protected: InputDispatcherInterface()40 InputDispatcherInterface() {} ~InputDispatcherInterface()41 virtual ~InputDispatcherInterface() {} 42 43 public: 44 /* Dumps the state of the input dispatcher. 45 * 46 * This method may be called on any thread (usually by the input manager). */ 47 virtual void dump(std::string& dump) = 0; 48 49 /* Called by the heatbeat to ensures that the dispatcher has not deadlocked. */ 50 virtual void monitor() = 0; 51 52 /** 53 * Wait until dispatcher is idle. That means, there are no further events to be processed, 54 * and all of the policy callbacks have been completed. 55 * Return true if the dispatcher is idle. 56 * Return false if the timeout waiting for the dispatcher to become idle has expired. 57 */ 58 virtual bool waitForIdle() = 0; 59 60 /* Make the dispatcher start processing events. 61 * 62 * The dispatcher will start consuming events from the InputListenerInterface 63 * in the order that they were received. 64 */ 65 virtual status_t start() = 0; 66 67 /* Makes the dispatcher stop processing events. */ 68 virtual status_t stop() = 0; 69 70 /* Injects an input event and optionally waits for sync. 71 * The synchronization mode determines whether the method blocks while waiting for 72 * input injection to proceed. 73 * Returns one of the INPUT_EVENT_INJECTION_XXX constants. 74 * 75 * This method may be called on any thread (usually by the input manager). 76 */ 77 virtual android::os::InputEventInjectionResult injectInputEvent( 78 const InputEvent* event, int32_t injectorPid, int32_t injectorUid, 79 android::os::InputEventInjectionSync syncMode, std::chrono::milliseconds timeout, 80 uint32_t policyFlags) = 0; 81 82 /* 83 * Check whether InputEvent actually happened by checking the signature of the event. 84 * 85 * Return nullptr if the event cannot be verified. 86 */ 87 virtual std::unique_ptr<VerifiedInputEvent> verifyInputEvent(const InputEvent& event) = 0; 88 89 /* Sets the list of input windows per display. 90 * 91 * This method may be called on any thread (usually by the input manager). 92 */ 93 virtual void setInputWindows( 94 const std::unordered_map<int32_t, std::vector<sp<InputWindowHandle>>>& 95 handlesPerDisplay) = 0; 96 97 /* Sets the focused application on the given display. 98 * 99 * This method may be called on any thread (usually by the input manager). 100 */ 101 virtual void setFocusedApplication( 102 int32_t displayId, 103 const std::shared_ptr<InputApplicationHandle>& inputApplicationHandle) = 0; 104 105 /* Sets the focused display. 106 * 107 * This method may be called on any thread (usually by the input manager). 108 */ 109 virtual void setFocusedDisplay(int32_t displayId) = 0; 110 111 /* Sets the input dispatching mode. 112 * 113 * This method may be called on any thread (usually by the input manager). 114 */ 115 virtual void setInputDispatchMode(bool enabled, bool frozen) = 0; 116 117 /* Sets whether input event filtering is enabled. 118 * When enabled, incoming input events are sent to the policy's filterInputEvent 119 * method instead of being dispatched. The filter is expected to use 120 * injectInputEvent to inject the events it would like to have dispatched. 121 * It should include POLICY_FLAG_FILTERED in the policy flags during injection. 122 */ 123 virtual void setInputFilterEnabled(bool enabled) = 0; 124 125 /** 126 * Set the touch mode state. 127 * Touch mode is a global state that apps may enter / exit based on specific 128 * user interactions with input devices. 129 * If true, the device is in touch mode. 130 */ 131 virtual void setInTouchMode(bool inTouchMode) = 0; 132 133 /** 134 * Sets the maximum allowed obscuring opacity by UID to propagate touches. 135 * For certain window types (eg. SAWs), the decision of honoring 136 * FLAG_NOT_TOUCHABLE or not depends on the combined obscuring opacity of 137 * the windows above the touch-consuming window. 138 */ 139 virtual void setMaximumObscuringOpacityForTouch(float opacity) = 0; 140 141 /** 142 * Sets the mode of the block untrusted touches feature. 143 * 144 * TODO(b/169067926): Clean-up feature modes. 145 */ 146 virtual void setBlockUntrustedTouchesMode(android::os::BlockUntrustedTouchesMode mode) = 0; 147 148 /* Transfers touch focus from one window to another window. 149 * 150 * Returns true on success. False if the window did not actually have touch focus. 151 */ 152 virtual bool transferTouchFocus(const sp<IBinder>& fromToken, const sp<IBinder>& toToken, 153 bool isDragDrop) = 0; 154 155 /** 156 * Transfer touch focus to the provided channel, no matter where the current touch is. 157 * 158 * Return true on success, false if there was no on-going touch. 159 */ 160 virtual bool transferTouch(const sp<IBinder>& destChannelToken) = 0; 161 162 /** 163 * Sets focus on the specified window. 164 */ 165 virtual void setFocusedWindow(const FocusRequest&) = 0; 166 167 /** 168 * Creates an input channel that may be used as targets for input events. 169 * 170 * This method may be called on any thread (usually by the input manager). 171 */ 172 virtual base::Result<std::unique_ptr<InputChannel>> createInputChannel( 173 const std::string& name) = 0; 174 175 /** 176 * Creates an input channel to be used to monitor input events. 177 * 178 * Each monitor must target a specific display and will only receive input events sent to that 179 * display. If the monitor is a gesture monitor, it will only receive pointer events on the 180 * targeted display. 181 * 182 * This method may be called on any thread (usually by the input manager). 183 */ 184 virtual base::Result<std::unique_ptr<InputChannel>> createInputMonitor(int32_t displayId, 185 bool gestureMonitor, 186 const std::string& name, 187 int32_t pid) = 0; 188 189 /* Removes input channels that will no longer receive input events. 190 * 191 * This method may be called on any thread (usually by the input manager). 192 */ 193 virtual status_t removeInputChannel(const sp<IBinder>& connectionToken) = 0; 194 195 /* Allows an input monitor steal the current pointer stream away from normal input windows. 196 * 197 * This method may be called on any thread (usually by the input manager). 198 */ 199 virtual status_t pilferPointers(const sp<IBinder>& token) = 0; 200 201 /** 202 * Enables Pointer Capture on the specified window if the window has focus. 203 * 204 * InputDispatcher is the source of truth of Pointer Capture. 205 */ 206 virtual void requestPointerCapture(const sp<IBinder>& windowToken, bool enabled) = 0; 207 /* Flush input device motion sensor. 208 * 209 * Returns true on success. 210 */ 211 virtual bool flushSensor(int deviceId, InputDeviceSensorType sensorType) = 0; 212 213 /** 214 * Called when a display has been removed from the system. 215 */ 216 virtual void displayRemoved(int32_t displayId) = 0; 217 }; 218 219 } // namespace android 220 221 #endif // _UI_INPUT_INPUTDISPATCHER_INPUTDISPATCHERINTERFACE_H 222