Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f93562ff authored by Prabir Pradhan's avatar Prabir Pradhan
Browse files

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
parent c5a98b50
Loading
Loading
Loading
Loading
+30 −0
Original line number Diff line number Diff line
@@ -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",
+9 −0
Original line number Diff line number Diff line
@@ -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;
+3 −0
Original line number Diff line number Diff line
@@ -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. */
+35 −0
Original line number Diff line number Diff line
/*
 * 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
+53 −0
Original line number Diff line number Diff line
/*
 * 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