InputDispatcher: Implement spy windows
We implement spy windows as outlined in go/spy-windows.
Bug: 162194035
Test: atest inputflinger_tests
Change-Id: Iea3404329184ab40492666f2a66396e9d8cb3594
diff --git a/services/inputflinger/dispatcher/TouchState.cpp b/services/inputflinger/dispatcher/TouchState.cpp
index 759b3e7..d624e99 100644
--- a/services/inputflinger/dispatcher/TouchState.cpp
+++ b/services/inputflinger/dispatcher/TouchState.cpp
@@ -105,8 +105,11 @@
}
}
-void TouchState::filterNonMonitors() {
- windows.clear();
+void TouchState::filterWindowsExcept(const sp<IBinder>& token) {
+ auto it = std::remove_if(windows.begin(), windows.end(), [&token](const TouchedWindow& w) {
+ return w.windowHandle->getToken() != token;
+ });
+ windows.erase(it, windows.end());
}
sp<WindowInfoHandle> TouchState::getFirstForegroundWindowHandle() const {
@@ -144,4 +147,14 @@
return nullptr;
}
+sp<WindowInfoHandle> TouchState::getWindow(const sp<IBinder>& token) const {
+ for (const TouchedWindow& touchedWindow : windows) {
+ const auto& windowHandle = touchedWindow.windowHandle;
+ if (windowHandle->getToken() == token) {
+ return windowHandle;
+ }
+ }
+ return nullptr;
+}
+
} // namespace android::inputdispatcher