xref: /aosp_15_r20/frameworks/native/services/inputflinger/InputManager.cpp (revision 38e8c45f13ce32b0dcecb25141ffecaf386fa17f)
1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker  * Copyright (C) 2010 The Android Open Source Project
3*38e8c45fSAndroid Build Coastguard Worker  *
4*38e8c45fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*38e8c45fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*38e8c45fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*38e8c45fSAndroid Build Coastguard Worker  *
8*38e8c45fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*38e8c45fSAndroid Build Coastguard Worker  *
10*38e8c45fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*38e8c45fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*38e8c45fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*38e8c45fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*38e8c45fSAndroid Build Coastguard Worker  * limitations under the License.
15*38e8c45fSAndroid Build Coastguard Worker  */
16*38e8c45fSAndroid Build Coastguard Worker 
17*38e8c45fSAndroid Build Coastguard Worker #define LOG_TAG "InputManager"
18*38e8c45fSAndroid Build Coastguard Worker 
19*38e8c45fSAndroid Build Coastguard Worker //#define LOG_NDEBUG 0
20*38e8c45fSAndroid Build Coastguard Worker 
21*38e8c45fSAndroid Build Coastguard Worker #include "InputManager.h"
22*38e8c45fSAndroid Build Coastguard Worker #include "InputDispatcherFactory.h"
23*38e8c45fSAndroid Build Coastguard Worker #include "InputReaderFactory.h"
24*38e8c45fSAndroid Build Coastguard Worker #include "UnwantedInteractionBlocker.h"
25*38e8c45fSAndroid Build Coastguard Worker 
26*38e8c45fSAndroid Build Coastguard Worker #include <aidl/com/android/server/inputflinger/IInputFlingerRust.h>
27*38e8c45fSAndroid Build Coastguard Worker #include <android/binder_interface_utils.h>
28*38e8c45fSAndroid Build Coastguard Worker #include <android/sysprop/InputProperties.sysprop.h>
29*38e8c45fSAndroid Build Coastguard Worker #include <binder/IPCThreadState.h>
30*38e8c45fSAndroid Build Coastguard Worker #include <com_android_input_flags.h>
31*38e8c45fSAndroid Build Coastguard Worker #include <inputflinger_bootstrap.rs.h>
32*38e8c45fSAndroid Build Coastguard Worker #include <log/log.h>
33*38e8c45fSAndroid Build Coastguard Worker #include <private/android_filesystem_config.h>
34*38e8c45fSAndroid Build Coastguard Worker 
35*38e8c45fSAndroid Build Coastguard Worker namespace input_flags = com::android::input::flags;
36*38e8c45fSAndroid Build Coastguard Worker 
37*38e8c45fSAndroid Build Coastguard Worker namespace android {
38*38e8c45fSAndroid Build Coastguard Worker 
39*38e8c45fSAndroid Build Coastguard Worker namespace {
40*38e8c45fSAndroid Build Coastguard Worker 
41*38e8c45fSAndroid Build Coastguard Worker const bool ENABLE_INPUT_DEVICE_USAGE_METRICS =
42*38e8c45fSAndroid Build Coastguard Worker         sysprop::InputProperties::enable_input_device_usage_metrics().value_or(true);
43*38e8c45fSAndroid Build Coastguard Worker 
44*38e8c45fSAndroid Build Coastguard Worker const bool ENABLE_INPUT_FILTER_RUST = input_flags::enable_input_filter_rust_impl();
45*38e8c45fSAndroid Build Coastguard Worker 
exceptionCodeFromStatusT(status_t status)46*38e8c45fSAndroid Build Coastguard Worker int32_t exceptionCodeFromStatusT(status_t status) {
47*38e8c45fSAndroid Build Coastguard Worker     switch (status) {
48*38e8c45fSAndroid Build Coastguard Worker         case OK:
49*38e8c45fSAndroid Build Coastguard Worker             return binder::Status::EX_NONE;
50*38e8c45fSAndroid Build Coastguard Worker         case INVALID_OPERATION:
51*38e8c45fSAndroid Build Coastguard Worker             return binder::Status::EX_UNSUPPORTED_OPERATION;
52*38e8c45fSAndroid Build Coastguard Worker         case BAD_VALUE:
53*38e8c45fSAndroid Build Coastguard Worker         case BAD_TYPE:
54*38e8c45fSAndroid Build Coastguard Worker         case NAME_NOT_FOUND:
55*38e8c45fSAndroid Build Coastguard Worker             return binder::Status::EX_ILLEGAL_ARGUMENT;
56*38e8c45fSAndroid Build Coastguard Worker         case NO_INIT:
57*38e8c45fSAndroid Build Coastguard Worker             return binder::Status::EX_ILLEGAL_STATE;
58*38e8c45fSAndroid Build Coastguard Worker         case PERMISSION_DENIED:
59*38e8c45fSAndroid Build Coastguard Worker             return binder::Status::EX_SECURITY;
60*38e8c45fSAndroid Build Coastguard Worker         default:
61*38e8c45fSAndroid Build Coastguard Worker             return binder::Status::EX_TRANSACTION_FAILED;
62*38e8c45fSAndroid Build Coastguard Worker     }
63*38e8c45fSAndroid Build Coastguard Worker }
64*38e8c45fSAndroid Build Coastguard Worker 
65*38e8c45fSAndroid Build Coastguard Worker // Convert a binder interface into a raw pointer to an AIBinder.
66*38e8c45fSAndroid Build Coastguard Worker using IInputFlingerRustBootstrapCallback = aidl::com::android::server::inputflinger::
67*38e8c45fSAndroid Build Coastguard Worker         IInputFlingerRust::IInputFlingerRustBootstrapCallback;
binderToPointer(IInputFlingerRustBootstrapCallback & interface)68*38e8c45fSAndroid Build Coastguard Worker IInputFlingerRustBootstrapCallbackAIBinder* binderToPointer(
69*38e8c45fSAndroid Build Coastguard Worker         IInputFlingerRustBootstrapCallback& interface) {
70*38e8c45fSAndroid Build Coastguard Worker     ndk::SpAIBinder spAIBinder = interface.asBinder();
71*38e8c45fSAndroid Build Coastguard Worker     auto* ptr = spAIBinder.get();
72*38e8c45fSAndroid Build Coastguard Worker     AIBinder_incStrong(ptr);
73*38e8c45fSAndroid Build Coastguard Worker     return ptr;
74*38e8c45fSAndroid Build Coastguard Worker }
75*38e8c45fSAndroid Build Coastguard Worker 
76*38e8c45fSAndroid Build Coastguard Worker // Create the Rust component of InputFlinger that uses AIDL interfaces as a the foreign function
77*38e8c45fSAndroid Build Coastguard Worker // interface (FFI). The bootstraping process for IInputFlingerRust is as follows:
78*38e8c45fSAndroid Build Coastguard Worker //   - Create BnInputFlingerRustBootstrapCallback in C++.
79*38e8c45fSAndroid Build Coastguard Worker //   - Use the cxxbridge ffi interface to call the Rust function `create_inputflinger_rust()`, and
80*38e8c45fSAndroid Build Coastguard Worker //     pass the callback binder object as a raw pointer.
81*38e8c45fSAndroid Build Coastguard Worker //   - The Rust implementation will create the implementation of IInputFlingerRust, and pass it
82*38e8c45fSAndroid Build Coastguard Worker //     to C++ through the callback.
83*38e8c45fSAndroid Build Coastguard Worker //   - After the Rust function returns, the binder interface provided to the callback will be the
84*38e8c45fSAndroid Build Coastguard Worker //     only strong reference to the IInputFlingerRust.
createInputFlingerRust()85*38e8c45fSAndroid Build Coastguard Worker std::shared_ptr<IInputFlingerRust> createInputFlingerRust() {
86*38e8c45fSAndroid Build Coastguard Worker     using namespace aidl::com::android::server::inputflinger;
87*38e8c45fSAndroid Build Coastguard Worker 
88*38e8c45fSAndroid Build Coastguard Worker     class Callback : public IInputFlingerRust::BnInputFlingerRustBootstrapCallback {
89*38e8c45fSAndroid Build Coastguard Worker         ndk::ScopedAStatus onProvideInputFlingerRust(
90*38e8c45fSAndroid Build Coastguard Worker                 const std::shared_ptr<IInputFlingerRust>& inputFlingerRust) override {
91*38e8c45fSAndroid Build Coastguard Worker             mService = inputFlingerRust;
92*38e8c45fSAndroid Build Coastguard Worker             return ndk::ScopedAStatus::ok();
93*38e8c45fSAndroid Build Coastguard Worker         }
94*38e8c45fSAndroid Build Coastguard Worker 
95*38e8c45fSAndroid Build Coastguard Worker     public:
96*38e8c45fSAndroid Build Coastguard Worker         std::shared_ptr<IInputFlingerRust> consumeInputFlingerRust() {
97*38e8c45fSAndroid Build Coastguard Worker             auto service = mService;
98*38e8c45fSAndroid Build Coastguard Worker             mService.reset();
99*38e8c45fSAndroid Build Coastguard Worker             return service;
100*38e8c45fSAndroid Build Coastguard Worker         }
101*38e8c45fSAndroid Build Coastguard Worker 
102*38e8c45fSAndroid Build Coastguard Worker     private:
103*38e8c45fSAndroid Build Coastguard Worker         std::shared_ptr<IInputFlingerRust> mService;
104*38e8c45fSAndroid Build Coastguard Worker     };
105*38e8c45fSAndroid Build Coastguard Worker 
106*38e8c45fSAndroid Build Coastguard Worker     auto callback = ndk::SharedRefBase::make<Callback>();
107*38e8c45fSAndroid Build Coastguard Worker     create_inputflinger_rust(binderToPointer(*callback));
108*38e8c45fSAndroid Build Coastguard Worker     auto service = callback->consumeInputFlingerRust();
109*38e8c45fSAndroid Build Coastguard Worker     LOG_ALWAYS_FATAL_IF(!service,
110*38e8c45fSAndroid Build Coastguard Worker                         "create_inputflinger_rust did not provide the IInputFlingerRust "
111*38e8c45fSAndroid Build Coastguard Worker                         "implementation through the callback.");
112*38e8c45fSAndroid Build Coastguard Worker     return service;
113*38e8c45fSAndroid Build Coastguard Worker }
114*38e8c45fSAndroid Build Coastguard Worker 
115*38e8c45fSAndroid Build Coastguard Worker } // namespace
116*38e8c45fSAndroid Build Coastguard Worker 
117*38e8c45fSAndroid Build Coastguard Worker /**
118*38e8c45fSAndroid Build Coastguard Worker  * The event flow is via the "InputListener" interface, as follows:
119*38e8c45fSAndroid Build Coastguard Worker  *   InputReader
120*38e8c45fSAndroid Build Coastguard Worker  *     -> UnwantedInteractionBlocker
121*38e8c45fSAndroid Build Coastguard Worker  *     -> InputFilter
122*38e8c45fSAndroid Build Coastguard Worker  *     -> PointerChoreographer
123*38e8c45fSAndroid Build Coastguard Worker  *     -> InputProcessor
124*38e8c45fSAndroid Build Coastguard Worker  *     -> InputDeviceMetricsCollector
125*38e8c45fSAndroid Build Coastguard Worker  *     -> InputDispatcher
126*38e8c45fSAndroid Build Coastguard Worker  */
InputManager(const sp<InputReaderPolicyInterface> & readerPolicy,InputDispatcherPolicyInterface & dispatcherPolicy,PointerChoreographerPolicyInterface & choreographerPolicy,InputFilterPolicyInterface & inputFilterPolicy)127*38e8c45fSAndroid Build Coastguard Worker InputManager::InputManager(const sp<InputReaderPolicyInterface>& readerPolicy,
128*38e8c45fSAndroid Build Coastguard Worker                            InputDispatcherPolicyInterface& dispatcherPolicy,
129*38e8c45fSAndroid Build Coastguard Worker                            PointerChoreographerPolicyInterface& choreographerPolicy,
130*38e8c45fSAndroid Build Coastguard Worker                            InputFilterPolicyInterface& inputFilterPolicy) {
131*38e8c45fSAndroid Build Coastguard Worker     mInputFlingerRust = createInputFlingerRust();
132*38e8c45fSAndroid Build Coastguard Worker 
133*38e8c45fSAndroid Build Coastguard Worker     mDispatcher = createInputDispatcher(dispatcherPolicy);
134*38e8c45fSAndroid Build Coastguard Worker     mTracingStages.emplace_back(
135*38e8c45fSAndroid Build Coastguard Worker             std::make_unique<TracedInputListener>("InputDispatcher", *mDispatcher));
136*38e8c45fSAndroid Build Coastguard Worker 
137*38e8c45fSAndroid Build Coastguard Worker     if (ENABLE_INPUT_FILTER_RUST) {
138*38e8c45fSAndroid Build Coastguard Worker         mInputFilter = std::make_unique<InputFilter>(*mTracingStages.back(), *mInputFlingerRust,
139*38e8c45fSAndroid Build Coastguard Worker                                                      inputFilterPolicy);
140*38e8c45fSAndroid Build Coastguard Worker         mTracingStages.emplace_back(
141*38e8c45fSAndroid Build Coastguard Worker                 std::make_unique<TracedInputListener>("InputFilter", *mInputFilter));
142*38e8c45fSAndroid Build Coastguard Worker     }
143*38e8c45fSAndroid Build Coastguard Worker 
144*38e8c45fSAndroid Build Coastguard Worker     if (ENABLE_INPUT_DEVICE_USAGE_METRICS) {
145*38e8c45fSAndroid Build Coastguard Worker         mCollector = std::make_unique<InputDeviceMetricsCollector>(*mTracingStages.back());
146*38e8c45fSAndroid Build Coastguard Worker         mTracingStages.emplace_back(
147*38e8c45fSAndroid Build Coastguard Worker                 std::make_unique<TracedInputListener>("MetricsCollector", *mCollector));
148*38e8c45fSAndroid Build Coastguard Worker     }
149*38e8c45fSAndroid Build Coastguard Worker 
150*38e8c45fSAndroid Build Coastguard Worker     mProcessor = std::make_unique<InputProcessor>(*mTracingStages.back());
151*38e8c45fSAndroid Build Coastguard Worker     mTracingStages.emplace_back(
152*38e8c45fSAndroid Build Coastguard Worker             std::make_unique<TracedInputListener>("InputProcessor", *mProcessor));
153*38e8c45fSAndroid Build Coastguard Worker 
154*38e8c45fSAndroid Build Coastguard Worker     mChoreographer =
155*38e8c45fSAndroid Build Coastguard Worker             std::make_unique<PointerChoreographer>(*mTracingStages.back(), choreographerPolicy);
156*38e8c45fSAndroid Build Coastguard Worker     mTracingStages.emplace_back(
157*38e8c45fSAndroid Build Coastguard Worker             std::make_unique<TracedInputListener>("PointerChoreographer", *mChoreographer));
158*38e8c45fSAndroid Build Coastguard Worker 
159*38e8c45fSAndroid Build Coastguard Worker     mBlocker = std::make_unique<UnwantedInteractionBlocker>(*mTracingStages.back());
160*38e8c45fSAndroid Build Coastguard Worker     mTracingStages.emplace_back(
161*38e8c45fSAndroid Build Coastguard Worker             std::make_unique<TracedInputListener>("UnwantedInteractionBlocker", *mBlocker));
162*38e8c45fSAndroid Build Coastguard Worker 
163*38e8c45fSAndroid Build Coastguard Worker     mReader = createInputReader(readerPolicy, *mTracingStages.back());
164*38e8c45fSAndroid Build Coastguard Worker }
165*38e8c45fSAndroid Build Coastguard Worker 
~InputManager()166*38e8c45fSAndroid Build Coastguard Worker InputManager::~InputManager() {
167*38e8c45fSAndroid Build Coastguard Worker     stop();
168*38e8c45fSAndroid Build Coastguard Worker }
169*38e8c45fSAndroid Build Coastguard Worker 
start()170*38e8c45fSAndroid Build Coastguard Worker status_t InputManager::start() {
171*38e8c45fSAndroid Build Coastguard Worker     status_t result = mDispatcher->start();
172*38e8c45fSAndroid Build Coastguard Worker     if (result) {
173*38e8c45fSAndroid Build Coastguard Worker         ALOGE("Could not start InputDispatcher thread due to error %d.", result);
174*38e8c45fSAndroid Build Coastguard Worker         return result;
175*38e8c45fSAndroid Build Coastguard Worker     }
176*38e8c45fSAndroid Build Coastguard Worker 
177*38e8c45fSAndroid Build Coastguard Worker     result = mReader->start();
178*38e8c45fSAndroid Build Coastguard Worker     if (result) {
179*38e8c45fSAndroid Build Coastguard Worker         ALOGE("Could not start InputReader due to error %d.", result);
180*38e8c45fSAndroid Build Coastguard Worker 
181*38e8c45fSAndroid Build Coastguard Worker         mDispatcher->stop();
182*38e8c45fSAndroid Build Coastguard Worker         return result;
183*38e8c45fSAndroid Build Coastguard Worker     }
184*38e8c45fSAndroid Build Coastguard Worker 
185*38e8c45fSAndroid Build Coastguard Worker     return OK;
186*38e8c45fSAndroid Build Coastguard Worker }
187*38e8c45fSAndroid Build Coastguard Worker 
stop()188*38e8c45fSAndroid Build Coastguard Worker status_t InputManager::stop() {
189*38e8c45fSAndroid Build Coastguard Worker     status_t status = OK;
190*38e8c45fSAndroid Build Coastguard Worker 
191*38e8c45fSAndroid Build Coastguard Worker     status_t result = mReader->stop();
192*38e8c45fSAndroid Build Coastguard Worker     if (result) {
193*38e8c45fSAndroid Build Coastguard Worker         ALOGW("Could not stop InputReader due to error %d.", result);
194*38e8c45fSAndroid Build Coastguard Worker         status = result;
195*38e8c45fSAndroid Build Coastguard Worker     }
196*38e8c45fSAndroid Build Coastguard Worker 
197*38e8c45fSAndroid Build Coastguard Worker     result = mDispatcher->stop();
198*38e8c45fSAndroid Build Coastguard Worker     if (result) {
199*38e8c45fSAndroid Build Coastguard Worker         ALOGW("Could not stop InputDispatcher thread due to error %d.", result);
200*38e8c45fSAndroid Build Coastguard Worker         status = result;
201*38e8c45fSAndroid Build Coastguard Worker     }
202*38e8c45fSAndroid Build Coastguard Worker 
203*38e8c45fSAndroid Build Coastguard Worker     return status;
204*38e8c45fSAndroid Build Coastguard Worker }
205*38e8c45fSAndroid Build Coastguard Worker 
getReader()206*38e8c45fSAndroid Build Coastguard Worker InputReaderInterface& InputManager::getReader() {
207*38e8c45fSAndroid Build Coastguard Worker     return *mReader;
208*38e8c45fSAndroid Build Coastguard Worker }
209*38e8c45fSAndroid Build Coastguard Worker 
getChoreographer()210*38e8c45fSAndroid Build Coastguard Worker PointerChoreographerInterface& InputManager::getChoreographer() {
211*38e8c45fSAndroid Build Coastguard Worker     return *mChoreographer;
212*38e8c45fSAndroid Build Coastguard Worker }
213*38e8c45fSAndroid Build Coastguard Worker 
getProcessor()214*38e8c45fSAndroid Build Coastguard Worker InputProcessorInterface& InputManager::getProcessor() {
215*38e8c45fSAndroid Build Coastguard Worker     return *mProcessor;
216*38e8c45fSAndroid Build Coastguard Worker }
217*38e8c45fSAndroid Build Coastguard Worker 
getMetricsCollector()218*38e8c45fSAndroid Build Coastguard Worker InputDeviceMetricsCollectorInterface& InputManager::getMetricsCollector() {
219*38e8c45fSAndroid Build Coastguard Worker     return *mCollector;
220*38e8c45fSAndroid Build Coastguard Worker }
221*38e8c45fSAndroid Build Coastguard Worker 
getDispatcher()222*38e8c45fSAndroid Build Coastguard Worker InputDispatcherInterface& InputManager::getDispatcher() {
223*38e8c45fSAndroid Build Coastguard Worker     return *mDispatcher;
224*38e8c45fSAndroid Build Coastguard Worker }
225*38e8c45fSAndroid Build Coastguard Worker 
getInputFilter()226*38e8c45fSAndroid Build Coastguard Worker InputFilterInterface& InputManager::getInputFilter() {
227*38e8c45fSAndroid Build Coastguard Worker     return *mInputFilter;
228*38e8c45fSAndroid Build Coastguard Worker }
229*38e8c45fSAndroid Build Coastguard Worker 
monitor()230*38e8c45fSAndroid Build Coastguard Worker void InputManager::monitor() {
231*38e8c45fSAndroid Build Coastguard Worker     mReader->monitor();
232*38e8c45fSAndroid Build Coastguard Worker     mBlocker->monitor();
233*38e8c45fSAndroid Build Coastguard Worker     mProcessor->monitor();
234*38e8c45fSAndroid Build Coastguard Worker     if (ENABLE_INPUT_DEVICE_USAGE_METRICS) {
235*38e8c45fSAndroid Build Coastguard Worker         mCollector->monitor();
236*38e8c45fSAndroid Build Coastguard Worker     }
237*38e8c45fSAndroid Build Coastguard Worker     mDispatcher->monitor();
238*38e8c45fSAndroid Build Coastguard Worker }
239*38e8c45fSAndroid Build Coastguard Worker 
dump(std::string & dump)240*38e8c45fSAndroid Build Coastguard Worker void InputManager::dump(std::string& dump) {
241*38e8c45fSAndroid Build Coastguard Worker     mReader->dump(dump);
242*38e8c45fSAndroid Build Coastguard Worker     dump += '\n';
243*38e8c45fSAndroid Build Coastguard Worker     mBlocker->dump(dump);
244*38e8c45fSAndroid Build Coastguard Worker     dump += '\n';
245*38e8c45fSAndroid Build Coastguard Worker     mChoreographer->dump(dump);
246*38e8c45fSAndroid Build Coastguard Worker     dump += '\n';
247*38e8c45fSAndroid Build Coastguard Worker     mProcessor->dump(dump);
248*38e8c45fSAndroid Build Coastguard Worker     dump += '\n';
249*38e8c45fSAndroid Build Coastguard Worker     if (ENABLE_INPUT_DEVICE_USAGE_METRICS) {
250*38e8c45fSAndroid Build Coastguard Worker         mCollector->dump(dump);
251*38e8c45fSAndroid Build Coastguard Worker         dump += '\n';
252*38e8c45fSAndroid Build Coastguard Worker     }
253*38e8c45fSAndroid Build Coastguard Worker     if (ENABLE_INPUT_FILTER_RUST) {
254*38e8c45fSAndroid Build Coastguard Worker         mInputFilter->dump(dump);
255*38e8c45fSAndroid Build Coastguard Worker         dump += '\n';
256*38e8c45fSAndroid Build Coastguard Worker     }
257*38e8c45fSAndroid Build Coastguard Worker     mDispatcher->dump(dump);
258*38e8c45fSAndroid Build Coastguard Worker     dump += '\n';
259*38e8c45fSAndroid Build Coastguard Worker }
260*38e8c45fSAndroid Build Coastguard Worker 
261*38e8c45fSAndroid Build Coastguard Worker // Used by tests only.
createInputChannel(const std::string & name,android::os::InputChannelCore * outChannel)262*38e8c45fSAndroid Build Coastguard Worker binder::Status InputManager::createInputChannel(const std::string& name,
263*38e8c45fSAndroid Build Coastguard Worker                                                 android::os::InputChannelCore* outChannel) {
264*38e8c45fSAndroid Build Coastguard Worker     IPCThreadState* ipc = IPCThreadState::self();
265*38e8c45fSAndroid Build Coastguard Worker     const uid_t uid = ipc->getCallingUid();
266*38e8c45fSAndroid Build Coastguard Worker     if (uid != AID_SHELL && uid != AID_ROOT) {
267*38e8c45fSAndroid Build Coastguard Worker         LOG(ERROR) << __func__ << " can only be called by SHELL or ROOT users, "
268*38e8c45fSAndroid Build Coastguard Worker                    << "but was called from UID " << uid;
269*38e8c45fSAndroid Build Coastguard Worker         return binder::Status::
270*38e8c45fSAndroid Build Coastguard Worker                 fromExceptionCode(EX_SECURITY,
271*38e8c45fSAndroid Build Coastguard Worker                                   "This uid is not allowed to call createInputChannel");
272*38e8c45fSAndroid Build Coastguard Worker     }
273*38e8c45fSAndroid Build Coastguard Worker 
274*38e8c45fSAndroid Build Coastguard Worker     base::Result<std::unique_ptr<InputChannel>> channel = mDispatcher->createInputChannel(name);
275*38e8c45fSAndroid Build Coastguard Worker     if (!channel.ok()) {
276*38e8c45fSAndroid Build Coastguard Worker         return binder::Status::fromExceptionCode(exceptionCodeFromStatusT(channel.error().code()),
277*38e8c45fSAndroid Build Coastguard Worker                                                  channel.error().message().c_str());
278*38e8c45fSAndroid Build Coastguard Worker     }
279*38e8c45fSAndroid Build Coastguard Worker     InputChannel::moveChannel(std::move(*channel), *outChannel);
280*38e8c45fSAndroid Build Coastguard Worker     return binder::Status::ok();
281*38e8c45fSAndroid Build Coastguard Worker }
282*38e8c45fSAndroid Build Coastguard Worker 
removeInputChannel(const sp<IBinder> & connectionToken)283*38e8c45fSAndroid Build Coastguard Worker binder::Status InputManager::removeInputChannel(const sp<IBinder>& connectionToken) {
284*38e8c45fSAndroid Build Coastguard Worker     mDispatcher->removeInputChannel(connectionToken);
285*38e8c45fSAndroid Build Coastguard Worker     return binder::Status::ok();
286*38e8c45fSAndroid Build Coastguard Worker }
287*38e8c45fSAndroid Build Coastguard Worker 
dump(int fd,const Vector<String16> & args)288*38e8c45fSAndroid Build Coastguard Worker status_t InputManager::dump(int fd, const Vector<String16>& args) {
289*38e8c45fSAndroid Build Coastguard Worker     std::string dump;
290*38e8c45fSAndroid Build Coastguard Worker 
291*38e8c45fSAndroid Build Coastguard Worker     dump += " InputFlinger dump\n";
292*38e8c45fSAndroid Build Coastguard Worker 
293*38e8c45fSAndroid Build Coastguard Worker     TEMP_FAILURE_RETRY(::write(fd, dump.c_str(), dump.size()));
294*38e8c45fSAndroid Build Coastguard Worker     return NO_ERROR;
295*38e8c45fSAndroid Build Coastguard Worker }
296*38e8c45fSAndroid Build Coastguard Worker 
setFocusedWindow(const gui::FocusRequest & request)297*38e8c45fSAndroid Build Coastguard Worker binder::Status InputManager::setFocusedWindow(const gui::FocusRequest& request) {
298*38e8c45fSAndroid Build Coastguard Worker     mDispatcher->setFocusedWindow(request);
299*38e8c45fSAndroid Build Coastguard Worker     return binder::Status::ok();
300*38e8c45fSAndroid Build Coastguard Worker }
301*38e8c45fSAndroid Build Coastguard Worker 
302*38e8c45fSAndroid Build Coastguard Worker } // namespace android
303