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
diff --git a/services/inputflinger/dispatcher/InputDispatcher.cpp b/services/inputflinger/dispatcher/InputDispatcher.cpp
index 7094c74..41d804c 100644
--- a/services/inputflinger/dispatcher/InputDispatcher.cpp
+++ b/services/inputflinger/dispatcher/InputDispatcher.cpp
@@ -4403,6 +4403,24 @@
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 @@
}
dump += dumpFocusedWindowsLocked();
+ dump += dumpPendingFocusRequestsLocked();
if (!mTouchStatesByDisplay.empty()) {
dump += StringPrintf(INDENT "TouchStatesByDisplay:\n");
@@ -4830,6 +4849,14 @@
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);
diff --git a/services/inputflinger/dispatcher/InputDispatcher.h b/services/inputflinger/dispatcher/InputDispatcher.h
index 4565151..5387c40 100644
--- a/services/inputflinger/dispatcher/InputDispatcher.h
+++ b/services/inputflinger/dispatcher/InputDispatcher.h
@@ -210,6 +210,8 @@
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 @@
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);