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

Commit ad991405 authored by Siarhei Vishniakou's avatar Siarhei Vishniakou
Browse files

Add dump of pending focus requests

Assuming we are keeping this code, let's add a dump of pending focus
requests for better debugging of focus-related issues.

Since printing a token is pretty meaningless (and not clear how to do),
we try to find the window associated with this token instead.

Sample dump:

mPendingFocusRequests:
    displayId=0, token->'Window{ff00537 u0 com.android.chrome/org.chromium.chrome.browser.firstrun.FirstRunActivity}', focusedToken->'<nullptr>'

Bug: 171130500
Test: adb shell monkey 10000 then adb shell dumpsys input | grep -i
focusreq -A 2 and see the output produced. Sample output is above

Change-Id: Id99ae4f3253a5037b352b41ee108e19c7f6f8eb2
parent 9301db1b
Loading
Loading
Loading
Loading
+27 −0
Original line number Diff line number Diff line
@@ -4403,6 +4403,24 @@ std::string InputDispatcher::dumpFocusedWindowsLocked() {
    return dump;
}

std::string InputDispatcher::dumpPendingFocusRequestsLocked() {
    if (mPendingFocusRequests.empty()) {
        return INDENT "mPendingFocusRequests: <none>\n";
    }

    std::string dump;
    dump += INDENT "mPendingFocusRequests:\n";
    for (const auto& [displayId, focusRequest] : mPendingFocusRequests) {
        // Rather than printing raw values for focusRequest.token and focusRequest.focusedToken,
        // try to resolve them to actual windows.
        std::string windowName = getConnectionNameLocked(focusRequest.token);
        std::string focusedWindowName = getConnectionNameLocked(focusRequest.focusedToken);
        dump += StringPrintf(INDENT2 "displayId=%" PRId32 ", token->%s, focusedToken->%s\n",
                             displayId, windowName.c_str(), focusedWindowName.c_str());
    }
    return dump;
}

void InputDispatcher::dumpDispatchStateLocked(std::string& dump) {
    dump += StringPrintf(INDENT "DispatchEnabled: %s\n", toString(mDispatchEnabled));
    dump += StringPrintf(INDENT "DispatchFrozen: %s\n", toString(mDispatchFrozen));
@@ -4425,6 +4443,7 @@ void InputDispatcher::dumpDispatchStateLocked(std::string& dump) {
    }

    dump += dumpFocusedWindowsLocked();
    dump += dumpPendingFocusRequestsLocked();

    if (!mTouchStatesByDisplay.empty()) {
        dump += StringPrintf(INDENT "TouchStatesByDisplay:\n");
@@ -4830,6 +4849,14 @@ sp<Connection> InputDispatcher::getConnectionLocked(const sp<IBinder>& inputConn
    return nullptr;
}

std::string InputDispatcher::getConnectionNameLocked(const sp<IBinder>& connectionToken) const {
    sp<Connection> connection = getConnectionLocked(connectionToken);
    if (connection == nullptr) {
        return "<nullptr>";
    }
    return connection->getInputChannelName();
}

void InputDispatcher::removeConnectionLocked(const sp<Connection>& connection) {
    mAnrTracker.eraseToken(connection->inputChannel->getConnectionToken());
    removeByValue(mConnectionsByFd, connection);
+3 −0
Original line number Diff line number Diff line
@@ -210,6 +210,8 @@ private:
    sp<Connection> getConnectionLocked(const sp<IBinder>& inputConnectionToken) const
            REQUIRES(mLock);

    std::string getConnectionNameLocked(const sp<IBinder>& connectionToken) const REQUIRES(mLock);

    void removeConnectionLocked(const sp<Connection>& connection) REQUIRES(mLock);

    struct IBinderHash {
@@ -532,6 +534,7 @@ private:
    void dumpMonitors(std::string& dump, const std::vector<Monitor>& monitors);
    void logDispatchStateLocked() REQUIRES(mLock);
    std::string dumpFocusedWindowsLocked() REQUIRES(mLock);
    std::string dumpPendingFocusRequestsLocked() REQUIRES(mLock);

    // Registration.
    void removeMonitorChannelLocked(const sp<IBinder>& connectionToken) REQUIRES(mLock);