[16/n Dispatcher refactor] Move transferWallpaperTouch
In this CL we move transferWallpaperTouch to DispatcherTouchState
subclass.
Bug: 367661487
Bug: 245989146
Test: atest inputflinger_tests
Flag: EXEMPT refactor
Change-Id: I41ec66dcc56e4da395ab2b9dd7786e00fda5037d
diff --git a/services/inputflinger/dispatcher/InputDispatcher.cpp b/services/inputflinger/dispatcher/InputDispatcher.cpp
index 11ba592..fa76c34 100644
--- a/services/inputflinger/dispatcher/InputDispatcher.cpp
+++ b/services/inputflinger/dispatcher/InputDispatcher.cpp
@@ -5907,8 +5907,24 @@
synthesizeCancelationEventsForWindowLocked(fromWindowHandle, options, fromConnection);
// Check if the wallpaper window should deliver the corresponding event.
- transferWallpaperTouch(oldTargetFlags, newTargetFlags, fromWindowHandle, toWindowHandle,
- *state, deviceId, pointers, traceContext.getTracker());
+ const auto [cancellations, pointerDowns] =
+ mTouchStates.transferWallpaperTouch(fromWindowHandle, toWindowHandle, displayId,
+ deviceId, pointers, oldTargetFlags,
+ newTargetFlags, mWindowInfos,
+ mConnectionManager);
+ for (const auto& cancellationArgs : cancellations) {
+ // touch should be cancelled for old wallpaper window
+ LOG_ALWAYS_FATAL_IF(cancellationArgs.mode !=
+ CancelationOptions::Mode::CANCEL_POINTER_EVENTS);
+ synthesizeCancelationEventsForWindowLocked(cancellationArgs.windowHandle, options);
+ }
+ for (const auto& pointerDownArgs : pointerDowns) {
+ // expect pointer down on new the wallpaper window
+ synthesizePointerDownEventsForConnectionLocked(pointerDownArgs.downTimeInTarget,
+ pointerDownArgs.connection,
+ pointerDownArgs.targetFlags,
+ traceContext.getTracker());
+ }
// Because new window may have a wallpaper window, it will merge input state from it
// parent window, after this the firstNewPointerIdx in input state will be reset, then
@@ -7156,12 +7172,17 @@
}
}
-void InputDispatcher::transferWallpaperTouch(
+std::pair<std::list<InputDispatcher::DispatcherTouchState::CancellationArgs>,
+ std::list<InputDispatcher::DispatcherTouchState::PointerDownArgs>>
+InputDispatcher::DispatcherTouchState::transferWallpaperTouch(
+ const sp<gui::WindowInfoHandle> fromWindowHandle,
+ const sp<gui::WindowInfoHandle> toWindowHandle, ui::LogicalDisplayId displayId,
+ android::DeviceId deviceId, const std::vector<PointerProperties>& pointers,
ftl::Flags<InputTarget::Flags> oldTargetFlags,
- ftl::Flags<InputTarget::Flags> newTargetFlags, const sp<WindowInfoHandle> fromWindowHandle,
- const sp<WindowInfoHandle> toWindowHandle, TouchState& state, DeviceId deviceId,
- const std::vector<PointerProperties>& pointers,
- const std::unique_ptr<trace::EventTrackerInterface>& traceTracker) {
+ ftl::Flags<InputTarget::Flags> newTargetFlags, const DispatcherWindowInfo& windowInfos,
+ const ConnectionManager& connections) {
+ TouchState& state = getTouchState(displayId);
+
const bool oldHasWallpaper = oldTargetFlags.test(InputTarget::Flags::FOREGROUND) &&
fromWindowHandle->getInfo()->inputConfig.test(
gui::WindowInfo::InputConfig::DUPLICATE_TOUCH_TO_WALLPAPER);
@@ -7172,16 +7193,17 @@
const sp<WindowInfoHandle> oldWallpaper =
oldHasWallpaper ? state.getWallpaperWindow(deviceId) : nullptr;
const sp<WindowInfoHandle> newWallpaper =
- newHasWallpaper ? mWindowInfos.findWallpaperWindowBelow(toWindowHandle) : nullptr;
+ newHasWallpaper ? windowInfos.findWallpaperWindowBelow(toWindowHandle) : nullptr;
if (oldWallpaper == newWallpaper) {
- return;
+ return {};
}
+ std::list<CancellationArgs> cancellations;
+ std::list<PointerDownArgs> pointerDowns;
if (oldWallpaper != nullptr) {
- CancelationOptions options(CancelationOptions::Mode::CANCEL_POINTER_EVENTS,
- "transferring touch focus to another window", traceTracker);
state.removeWindowByToken(oldWallpaper->getToken());
- synthesizeCancelationEventsForWindowLocked(oldWallpaper, options);
+ cancellations.emplace_back(oldWallpaper, CancelationOptions::Mode::CANCEL_POINTER_EVENTS,
+ /*deviceId*/ std::nullopt);
}
if (newWallpaper != nullptr) {
@@ -7193,15 +7215,16 @@
state.addOrUpdateWindow(newWallpaper, InputTarget::DispatchMode::AS_IS, wallpaperFlags,
deviceId, pointers, downTimeInTarget);
std::shared_ptr<Connection> wallpaperConnection =
- mConnectionManager.getConnection(newWallpaper->getToken());
+ connections.getConnection(newWallpaper->getToken());
if (wallpaperConnection != nullptr) {
std::shared_ptr<Connection> toConnection =
- mConnectionManager.getConnection(toWindowHandle->getToken());
+ connections.getConnection(toWindowHandle->getToken());
toConnection->inputState.mergePointerStateTo(wallpaperConnection->inputState);
- synthesizePointerDownEventsForConnectionLocked(downTimeInTarget, wallpaperConnection,
- wallpaperFlags, traceTracker);
+ pointerDowns.emplace_back(downTimeInTarget, wallpaperConnection, wallpaperFlags);
}
+ pointerDowns.emplace_back(downTimeInTarget, wallpaperConnection, wallpaperFlags);
}
+ return {cancellations, pointerDowns};
}
sp<WindowInfoHandle> InputDispatcher::DispatcherWindowInfo::findWallpaperWindowBelow(
@@ -7455,4 +7478,10 @@
mTouchStatesByDisplay.clear();
}
+TouchState& InputDispatcher::DispatcherTouchState::getTouchState(ui::LogicalDisplayId displayId) {
+ auto touchStateIt = mTouchStatesByDisplay.find(displayId);
+ LOG_ALWAYS_FATAL_IF(touchStateIt == mTouchStatesByDisplay.end());
+ return touchStateIt->second;
+}
+
} // namespace android::inputdispatcher
diff --git a/services/inputflinger/dispatcher/InputDispatcher.h b/services/inputflinger/dispatcher/InputDispatcher.h
index f590806..2cbd0a2 100644
--- a/services/inputflinger/dispatcher/InputDispatcher.h
+++ b/services/inputflinger/dispatcher/InputDispatcher.h
@@ -358,6 +358,12 @@
std::optional<DeviceId> deviceId;
};
+ struct PointerDownArgs {
+ const nsecs_t downTimeInTarget;
+ const std::shared_ptr<Connection> connection;
+ const ftl::Flags<InputTarget::Flags> targetFlags;
+ };
+
static void addPointerWindowTarget(const sp<android::gui::WindowInfoHandle>& windowHandle,
InputTarget::DispatchMode dispatchMode,
ftl::Flags<InputTarget::Flags> targetFlags,
@@ -387,17 +393,27 @@
std::string dump() const;
// Updates the touchState for display from WindowInfo,
- // return vector of CancellationArgs for every cancelled touch
+ // returns list of CancellationArgs for every cancelled touch
std::list<CancellationArgs> updateFromWindowInfo(ui::LogicalDisplayId displayId,
const DispatcherWindowInfo& windowInfos);
void removeAllPointersForDevice(DeviceId deviceId);
+ std::pair<std::list<CancellationArgs>, std::list<PointerDownArgs>> transferWallpaperTouch(
+ const sp<gui::WindowInfoHandle> fromWindowHandle,
+ const sp<gui::WindowInfoHandle> toWindowHandle, ui::LogicalDisplayId displayId,
+ DeviceId deviceId, const std::vector<PointerProperties>& pointers,
+ ftl::Flags<InputTarget::Flags> oldTargetFlags,
+ ftl::Flags<InputTarget::Flags> newTargetFlags,
+ const DispatcherWindowInfo& windowInfos, const ConnectionManager& connections);
+
void clear();
std::unordered_map<ui::LogicalDisplayId, TouchState> mTouchStatesByDisplay;
private:
+ TouchState& getTouchState(ui::LogicalDisplayId displayId);
+
static std::list<CancellationArgs> eraseRemovedWindowsFromWindowInfo(
TouchState& state, ui::LogicalDisplayId displayId,
const DispatcherWindowInfo& windowInfos);
@@ -849,15 +865,6 @@
sp<InputReporterInterface> mReporter;
- void transferWallpaperTouch(ftl::Flags<InputTarget::Flags> oldTargetFlags,
- ftl::Flags<InputTarget::Flags> newTargetFlags,
- const sp<android::gui::WindowInfoHandle> fromWindowHandle,
- const sp<android::gui::WindowInfoHandle> toWindowHandle,
- TouchState& state, DeviceId deviceId,
- const std::vector<PointerProperties>& pointers,
- const std::unique_ptr<trace::EventTrackerInterface>& traceTracker)
- REQUIRES(mLock);
-
/** Stores the value of the input flag for per device input latency metrics. */
const bool mPerDeviceInputLatencyMetricsFlag =
com::android::input::flags::enable_per_device_input_latency_metrics();