diff options
| author | 2020-09-14 21:05:27 -0700 | |
|---|---|---|
| committer | 2020-09-21 10:12:18 -0700 | |
| commit | 6e9f864088187ecc59282a80c84a21b5d33a26f3 (patch) | |
| tree | d8228b929e14a3231b81753e8037bcc72f2db776 /services/inputflinger/InputManager.cpp | |
| parent | 443e7bd3696475a92becfa15ec03a8590af90fd0 (diff) | |
Let InputFlinger create the server InputChannel
We can be sure that server channel won't leave InputFlinger.
Bug: 167947395
Test: Touch events are still dispatched.
Test: m -j inputflinger
Test: atest inputflinger_tests
Test: atest inputflinger_benchmarks
Test: atest libgui_tests
Change-Id: I35f768c8a7b3bfe11e04577c028e52556b60ff14
Diffstat (limited to 'services/inputflinger/InputManager.cpp')
| -rw-r--r-- | services/inputflinger/InputManager.cpp | 32 |
1 files changed, 28 insertions, 4 deletions
diff --git a/services/inputflinger/InputManager.cpp b/services/inputflinger/InputManager.cpp index 8af9bcba89..3d995899d0 100644 --- a/services/inputflinger/InputManager.cpp +++ b/services/inputflinger/InputManager.cpp @@ -31,6 +31,25 @@ namespace android { +static int32_t exceptionCodeFromStatusT(status_t status) { + switch (status) { + case OK: + return binder::Status::EX_NONE; + case INVALID_OPERATION: + return binder::Status::EX_UNSUPPORTED_OPERATION; + case BAD_VALUE: + case BAD_TYPE: + case NAME_NOT_FOUND: + return binder::Status::EX_ILLEGAL_ARGUMENT; + case NO_INIT: + return binder::Status::EX_ILLEGAL_STATE; + case PERMISSION_DENIED: + return binder::Status::EX_SECURITY; + default: + return binder::Status::EX_TRANSACTION_FAILED; + } +} + InputManager::InputManager( const sp<InputReaderPolicyInterface>& readerPolicy, const sp<InputDispatcherPolicyInterface>& dispatcherPolicy) { @@ -119,7 +138,7 @@ binder::Status InputManager::setInputWindows( } // Used by tests only. -binder::Status InputManager::registerInputChannel(const InputChannel& channel) { +binder::Status InputManager::createInputChannel(const std::string& name, InputChannel* outChannel) { IPCThreadState* ipc = IPCThreadState::self(); const int uid = ipc->getCallingUid(); if (uid != AID_SHELL && uid != AID_ROOT) { @@ -128,12 +147,17 @@ binder::Status InputManager::registerInputChannel(const InputChannel& channel) { return binder::Status::ok(); } - mDispatcher->registerInputChannel(channel.dup()); + base::Result<std::unique_ptr<InputChannel>> channel = mDispatcher->createInputChannel(name); + if (!channel) { + return binder::Status::fromExceptionCode(exceptionCodeFromStatusT(channel.error().code()), + channel.error().message().c_str()); + } + (*channel)->copyTo(*outChannel); return binder::Status::ok(); } -binder::Status InputManager::unregisterInputChannel(const sp<IBinder>& connectionToken) { - mDispatcher->unregisterInputChannel(connectionToken); +binder::Status InputManager::removeInputChannel(const sp<IBinder>& connectionToken) { + mDispatcher->removeInputChannel(connectionToken); return binder::Status::ok(); } |