diff options
| author | 2018-11-29 12:13:37 -0800 | |
|---|---|---|
| committer | 2019-01-03 12:22:39 -0800 | |
| commit | f93562ffe3a444d1e3a5c265e5035d5f71752c79 (patch) | |
| tree | f463e73006aebb3a9ef8f0ac9b535a609bc65ba9 | |
| parent | c5a98b505c23e854036429c6aedf59aa6f213dbf (diff) | |
Add InputReporter interface to InputDispatcher
This adds a new library to inputflinger, libinputreporter, that handles
events reported from InputDispatcher.
The CL makes InputDispatcher notify InputReporter for two events:
- Unhandled Keys: Keys that were not handled by the system or apps. A key
event is unhandled if:
- The event was not handled and there is no fallback key; or
- The event was not handled and it has a fallback key,
but the fallback key was not handled.
- Dropped Keys: Key events can be dropped for several reasons, which
can be seen in InputReporter::DropReason.
Currently, the default implementation of InputReporter does nothing when
it recieves a dropped or unhandled key notification. The InputReporter
is created via its factory method, createInputReporter().
Bug: 119312287
Test: manual: Build, and verify using log output
Change-Id: I90ac525d648bb75e0bc8532f68f6a9e4ab51d54b
| -rw-r--r-- | services/inputflinger/Android.bp | 30 | ||||
| -rw-r--r-- | services/inputflinger/InputDispatcher.cpp | 9 | ||||
| -rw-r--r-- | services/inputflinger/InputDispatcher.h | 3 | ||||
| -rw-r--r-- | services/inputflinger/InputReporter.cpp | 35 | ||||
| -rw-r--r-- | services/inputflinger/include/InputReporter.h | 53 |
5 files changed, 130 insertions, 0 deletions
diff --git a/services/inputflinger/Android.bp b/services/inputflinger/Android.bp index 0d8d34ff5d..843eb379d9 100644 --- a/services/inputflinger/Android.bp +++ b/services/inputflinger/Android.bp @@ -22,6 +22,7 @@ cc_library_shared { shared_libs: [ "libinputflinger_base", + "libinputreporter", "libinputreader", "libbase", "libbinder", @@ -125,6 +126,35 @@ cc_library_shared { ], } +cc_library_shared { + name: "libinputreporter", + + srcs: [ + "InputReporter.cpp", + ], + + shared_libs: [ + "libbase", + "liblog", + "libutils", + ], + + header_libs: [ + "libinputflinger_headers", + ], + + export_header_lib_headers: [ + "libinputflinger_headers", + ], + + cflags: [ + "-Wall", + "-Wextra", + "-Werror", + "-Wno-unused-parameter", + ], +} + subdirs = [ "host", "tests", diff --git a/services/inputflinger/InputDispatcher.cpp b/services/inputflinger/InputDispatcher.cpp index 7fa9cb60d6..6173452166 100644 --- a/services/inputflinger/InputDispatcher.cpp +++ b/services/inputflinger/InputDispatcher.cpp @@ -257,6 +257,7 @@ InputDispatcher::InputDispatcher(const sp<InputDispatcherPolicyInterface>& polic mFocusedDisplayId(ADISPLAY_ID_DEFAULT), mInputTargetWaitCause(INPUT_TARGET_WAIT_CAUSE_NONE) { mLooper = new Looper(false); + mReporter = createInputReporter(); mKeyRepeatState.lastKeyEntry = nullptr; @@ -841,6 +842,7 @@ bool InputDispatcher::dispatchKeyLocked(nsecs_t currentTime, KeyEntry* entry, if (*dropReason != DROP_REASON_NOT_DROPPED) { setInjectionResultLocked(entry, *dropReason == DROP_REASON_POLICY ? INPUT_EVENT_INJECTION_SUCCEEDED : INPUT_EVENT_INJECTION_FAILED); + mReporter->reportDroppedKey(entry->sequenceNum); return true; } @@ -4025,6 +4027,10 @@ void InputDispatcher::doDispatchCycleFinishedLockedInterruptible( bool InputDispatcher::afterKeyEventLockedInterruptible(const sp<Connection>& connection, DispatchEntry* dispatchEntry, KeyEntry* keyEntry, bool handled) { if (keyEntry->flags & AKEY_EVENT_FLAG_FALLBACK) { + if (!handled) { + // Report the key as unhandled, since the fallback was not handled. + mReporter->reportUnhandledKey(keyEntry->sequenceNum); + } return false; } @@ -4192,6 +4198,9 @@ bool InputDispatcher::afterKeyEventLockedInterruptible(const sp<Connection>& con #if DEBUG_OUTBOUND_EVENT_DETAILS ALOGD("Unhandled key event: No fallback key."); #endif + + // Report the key as unhandled, since there is no fallback key. + mReporter->reportUnhandledKey(keyEntry->sequenceNum); } } return false; diff --git a/services/inputflinger/InputDispatcher.h b/services/inputflinger/InputDispatcher.h index 05b5dadc66..7e6de6a2d9 100644 --- a/services/inputflinger/InputDispatcher.h +++ b/services/inputflinger/InputDispatcher.h @@ -37,6 +37,7 @@ #include <unordered_map> #include "InputListener.h" +#include "InputReporter.h" namespace android { @@ -1186,6 +1187,8 @@ private: void traceInboundQueueLengthLocked(); void traceOutboundQueueLengthLocked(const sp<Connection>& connection); void traceWaitQueueLengthLocked(const sp<Connection>& connection); + + sp<InputReporter> mReporter; }; /* Enqueues and dispatches input events, endlessly. */ diff --git a/services/inputflinger/InputReporter.cpp b/services/inputflinger/InputReporter.cpp new file mode 100644 index 0000000000..cf4220f8a9 --- /dev/null +++ b/services/inputflinger/InputReporter.cpp @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "InputReporter.h" + +namespace android { + +// --- InputReporter --- + +void InputReporter::reportUnhandledKey(uint32_t sequenceNum) { + // do nothing +} + +void InputReporter::reportDroppedKey(uint32_t sequenceNum) { + // do nothing +} + +sp<InputReporter> createInputReporter() { + return new InputReporter(); +} + +} // namespace android diff --git a/services/inputflinger/include/InputReporter.h b/services/inputflinger/include/InputReporter.h new file mode 100644 index 0000000000..c86dcda373 --- /dev/null +++ b/services/inputflinger/include/InputReporter.h @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef _UI_INPUT_REPORTER_H +#define _UI_INPUT_REPORTER_H + +#include <utils/RefBase.h> + +namespace android { + +/* + * The interface used by the InputDispatcher to report information about input events after + * it is sent to the application, such as if a key is unhandled or dropped. + */ +class InputReporter: public virtual RefBase { +protected: + virtual ~InputReporter() { } + +public: + // Report a key that was not handled by the system or apps. + // A key event is unhandled if: + // - The event was not handled and there is no fallback key; or + // - The event was not handled and it has a fallback key, + // but the fallback key was not handled. + virtual void reportUnhandledKey(uint32_t sequenceNum); + + // Report a key that was dropped by InputDispatcher. + // A key can be dropped for several reasons. See the enum + // InputDispatcher::DropReason for details. + virtual void reportDroppedKey(uint32_t sequenceNum); +}; + +/* + * Factory method for InputReporter. + */ +sp<InputReporter> createInputReporter(); + +} // namespace android + +#endif // _UI_INPUT_REPORTER_H |