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