1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker * Copyright 2024 The Android Open Source Project
3*38e8c45fSAndroid Build Coastguard Worker *
4*38e8c45fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*38e8c45fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*38e8c45fSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*38e8c45fSAndroid Build Coastguard Worker *
8*38e8c45fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*38e8c45fSAndroid Build Coastguard Worker *
10*38e8c45fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*38e8c45fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*38e8c45fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*38e8c45fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*38e8c45fSAndroid Build Coastguard Worker * limitations under the License.
15*38e8c45fSAndroid Build Coastguard Worker */
16*38e8c45fSAndroid Build Coastguard Worker
17*38e8c45fSAndroid Build Coastguard Worker #include "FakeInputDispatcherPolicy.h"
18*38e8c45fSAndroid Build Coastguard Worker
19*38e8c45fSAndroid Build Coastguard Worker #include <gtest/gtest.h>
20*38e8c45fSAndroid Build Coastguard Worker
21*38e8c45fSAndroid Build Coastguard Worker namespace android {
22*38e8c45fSAndroid Build Coastguard Worker
23*38e8c45fSAndroid Build Coastguard Worker // --- FakeInputDispatcherPolicy ---
24*38e8c45fSAndroid Build Coastguard Worker
assertFilterInputEventWasCalled(const NotifyKeyArgs & args)25*38e8c45fSAndroid Build Coastguard Worker void FakeInputDispatcherPolicy::assertFilterInputEventWasCalled(const NotifyKeyArgs& args) {
26*38e8c45fSAndroid Build Coastguard Worker assertFilterInputEventWasCalledInternal([&args](const InputEvent& event) {
27*38e8c45fSAndroid Build Coastguard Worker ASSERT_EQ(event.getType(), InputEventType::KEY);
28*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(event.getDisplayId(), args.displayId);
29*38e8c45fSAndroid Build Coastguard Worker
30*38e8c45fSAndroid Build Coastguard Worker const auto& keyEvent = static_cast<const KeyEvent&>(event);
31*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(keyEvent.getEventTime(), args.eventTime);
32*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(keyEvent.getAction(), args.action);
33*38e8c45fSAndroid Build Coastguard Worker });
34*38e8c45fSAndroid Build Coastguard Worker }
35*38e8c45fSAndroid Build Coastguard Worker
assertFilterInputEventWasCalled(const NotifyMotionArgs & args,vec2 point)36*38e8c45fSAndroid Build Coastguard Worker void FakeInputDispatcherPolicy::assertFilterInputEventWasCalled(const NotifyMotionArgs& args,
37*38e8c45fSAndroid Build Coastguard Worker vec2 point) {
38*38e8c45fSAndroid Build Coastguard Worker assertFilterInputEventWasCalledInternal([&](const InputEvent& event) {
39*38e8c45fSAndroid Build Coastguard Worker ASSERT_EQ(event.getType(), InputEventType::MOTION);
40*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(event.getDisplayId(), args.displayId);
41*38e8c45fSAndroid Build Coastguard Worker
42*38e8c45fSAndroid Build Coastguard Worker const auto& motionEvent = static_cast<const MotionEvent&>(event);
43*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(motionEvent.getEventTime(), args.eventTime);
44*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(motionEvent.getAction(), args.action);
45*38e8c45fSAndroid Build Coastguard Worker EXPECT_NEAR(motionEvent.getX(0), point.x, MotionEvent::ROUNDING_PRECISION);
46*38e8c45fSAndroid Build Coastguard Worker EXPECT_NEAR(motionEvent.getY(0), point.y, MotionEvent::ROUNDING_PRECISION);
47*38e8c45fSAndroid Build Coastguard Worker EXPECT_NEAR(motionEvent.getRawX(0), point.x, MotionEvent::ROUNDING_PRECISION);
48*38e8c45fSAndroid Build Coastguard Worker EXPECT_NEAR(motionEvent.getRawY(0), point.y, MotionEvent::ROUNDING_PRECISION);
49*38e8c45fSAndroid Build Coastguard Worker });
50*38e8c45fSAndroid Build Coastguard Worker }
51*38e8c45fSAndroid Build Coastguard Worker
assertFilterInputEventWasNotCalled()52*38e8c45fSAndroid Build Coastguard Worker void FakeInputDispatcherPolicy::assertFilterInputEventWasNotCalled() {
53*38e8c45fSAndroid Build Coastguard Worker std::scoped_lock lock(mLock);
54*38e8c45fSAndroid Build Coastguard Worker ASSERT_EQ(nullptr, mFilteredEvent);
55*38e8c45fSAndroid Build Coastguard Worker }
56*38e8c45fSAndroid Build Coastguard Worker
assertNotifySwitchWasCalled(const NotifySwitchArgs & args)57*38e8c45fSAndroid Build Coastguard Worker void FakeInputDispatcherPolicy::assertNotifySwitchWasCalled(const NotifySwitchArgs& args) {
58*38e8c45fSAndroid Build Coastguard Worker std::scoped_lock lock(mLock);
59*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(mLastNotifySwitch);
60*38e8c45fSAndroid Build Coastguard Worker // We do not check id because it is not exposed to the policy
61*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(args.eventTime, mLastNotifySwitch->eventTime);
62*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(args.policyFlags, mLastNotifySwitch->policyFlags);
63*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(args.switchValues, mLastNotifySwitch->switchValues);
64*38e8c45fSAndroid Build Coastguard Worker EXPECT_EQ(args.switchMask, mLastNotifySwitch->switchMask);
65*38e8c45fSAndroid Build Coastguard Worker mLastNotifySwitch = std::nullopt;
66*38e8c45fSAndroid Build Coastguard Worker }
67*38e8c45fSAndroid Build Coastguard Worker
assertOnPointerDownEquals(const sp<IBinder> & touchedToken)68*38e8c45fSAndroid Build Coastguard Worker void FakeInputDispatcherPolicy::assertOnPointerDownEquals(const sp<IBinder>& touchedToken) {
69*38e8c45fSAndroid Build Coastguard Worker std::scoped_lock lock(mLock);
70*38e8c45fSAndroid Build Coastguard Worker ASSERT_EQ(touchedToken, mOnPointerDownToken);
71*38e8c45fSAndroid Build Coastguard Worker mOnPointerDownToken.clear();
72*38e8c45fSAndroid Build Coastguard Worker }
73*38e8c45fSAndroid Build Coastguard Worker
assertOnPointerDownWasNotCalled()74*38e8c45fSAndroid Build Coastguard Worker void FakeInputDispatcherPolicy::assertOnPointerDownWasNotCalled() {
75*38e8c45fSAndroid Build Coastguard Worker std::scoped_lock lock(mLock);
76*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(mOnPointerDownToken == nullptr)
77*38e8c45fSAndroid Build Coastguard Worker << "Expected onPointerDownOutsideFocus to not have been called";
78*38e8c45fSAndroid Build Coastguard Worker }
79*38e8c45fSAndroid Build Coastguard Worker
assertNotifyNoFocusedWindowAnrWasCalled(std::chrono::nanoseconds timeout,const std::shared_ptr<InputApplicationHandle> & expectedApplication)80*38e8c45fSAndroid Build Coastguard Worker void FakeInputDispatcherPolicy::assertNotifyNoFocusedWindowAnrWasCalled(
81*38e8c45fSAndroid Build Coastguard Worker std::chrono::nanoseconds timeout,
82*38e8c45fSAndroid Build Coastguard Worker const std::shared_ptr<InputApplicationHandle>& expectedApplication) {
83*38e8c45fSAndroid Build Coastguard Worker std::unique_lock lock(mLock);
84*38e8c45fSAndroid Build Coastguard Worker android::base::ScopedLockAssertion assumeLocked(mLock);
85*38e8c45fSAndroid Build Coastguard Worker std::shared_ptr<InputApplicationHandle> application;
86*38e8c45fSAndroid Build Coastguard Worker ASSERT_NO_FATAL_FAILURE(
87*38e8c45fSAndroid Build Coastguard Worker application = getAnrTokenLockedInterruptible(timeout, mAnrApplications, lock));
88*38e8c45fSAndroid Build Coastguard Worker ASSERT_EQ(expectedApplication, application);
89*38e8c45fSAndroid Build Coastguard Worker }
90*38e8c45fSAndroid Build Coastguard Worker
assertNotifyWindowUnresponsiveWasCalled(std::chrono::nanoseconds timeout,const sp<gui::WindowInfoHandle> & window)91*38e8c45fSAndroid Build Coastguard Worker void FakeInputDispatcherPolicy::assertNotifyWindowUnresponsiveWasCalled(
92*38e8c45fSAndroid Build Coastguard Worker std::chrono::nanoseconds timeout, const sp<gui::WindowInfoHandle>& window) {
93*38e8c45fSAndroid Build Coastguard Worker LOG_ALWAYS_FATAL_IF(window == nullptr, "window should not be null");
94*38e8c45fSAndroid Build Coastguard Worker assertNotifyWindowUnresponsiveWasCalled(timeout, window->getToken(),
95*38e8c45fSAndroid Build Coastguard Worker window->getInfo()->ownerPid);
96*38e8c45fSAndroid Build Coastguard Worker }
97*38e8c45fSAndroid Build Coastguard Worker
assertNotifyWindowUnresponsiveWasCalled(std::chrono::nanoseconds timeout,const sp<IBinder> & expectedToken,std::optional<gui::Pid> expectedPid)98*38e8c45fSAndroid Build Coastguard Worker void FakeInputDispatcherPolicy::assertNotifyWindowUnresponsiveWasCalled(
99*38e8c45fSAndroid Build Coastguard Worker std::chrono::nanoseconds timeout, const sp<IBinder>& expectedToken,
100*38e8c45fSAndroid Build Coastguard Worker std::optional<gui::Pid> expectedPid) {
101*38e8c45fSAndroid Build Coastguard Worker std::unique_lock lock(mLock);
102*38e8c45fSAndroid Build Coastguard Worker android::base::ScopedLockAssertion assumeLocked(mLock);
103*38e8c45fSAndroid Build Coastguard Worker AnrResult result;
104*38e8c45fSAndroid Build Coastguard Worker ASSERT_NO_FATAL_FAILURE(result = getAnrTokenLockedInterruptible(timeout, mAnrWindows, lock));
105*38e8c45fSAndroid Build Coastguard Worker ASSERT_EQ(expectedToken, result.token);
106*38e8c45fSAndroid Build Coastguard Worker ASSERT_EQ(expectedPid, result.pid);
107*38e8c45fSAndroid Build Coastguard Worker }
108*38e8c45fSAndroid Build Coastguard Worker
getUnresponsiveWindowToken(std::chrono::nanoseconds timeout)109*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> FakeInputDispatcherPolicy::getUnresponsiveWindowToken(
110*38e8c45fSAndroid Build Coastguard Worker std::chrono::nanoseconds timeout) {
111*38e8c45fSAndroid Build Coastguard Worker std::unique_lock lock(mLock);
112*38e8c45fSAndroid Build Coastguard Worker android::base::ScopedLockAssertion assumeLocked(mLock);
113*38e8c45fSAndroid Build Coastguard Worker AnrResult result = getAnrTokenLockedInterruptible(timeout, mAnrWindows, lock);
114*38e8c45fSAndroid Build Coastguard Worker const auto& [token, _] = result;
115*38e8c45fSAndroid Build Coastguard Worker return token;
116*38e8c45fSAndroid Build Coastguard Worker }
117*38e8c45fSAndroid Build Coastguard Worker
assertNotifyWindowResponsiveWasCalled(const sp<IBinder> & expectedToken,std::optional<gui::Pid> expectedPid)118*38e8c45fSAndroid Build Coastguard Worker void FakeInputDispatcherPolicy::assertNotifyWindowResponsiveWasCalled(
119*38e8c45fSAndroid Build Coastguard Worker const sp<IBinder>& expectedToken, std::optional<gui::Pid> expectedPid) {
120*38e8c45fSAndroid Build Coastguard Worker std::unique_lock lock(mLock);
121*38e8c45fSAndroid Build Coastguard Worker android::base::ScopedLockAssertion assumeLocked(mLock);
122*38e8c45fSAndroid Build Coastguard Worker AnrResult result;
123*38e8c45fSAndroid Build Coastguard Worker ASSERT_NO_FATAL_FAILURE(result = getAnrTokenLockedInterruptible(0s, mResponsiveWindows, lock));
124*38e8c45fSAndroid Build Coastguard Worker ASSERT_EQ(expectedToken, result.token);
125*38e8c45fSAndroid Build Coastguard Worker ASSERT_EQ(expectedPid, result.pid);
126*38e8c45fSAndroid Build Coastguard Worker }
127*38e8c45fSAndroid Build Coastguard Worker
getResponsiveWindowToken()128*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> FakeInputDispatcherPolicy::getResponsiveWindowToken() {
129*38e8c45fSAndroid Build Coastguard Worker std::unique_lock lock(mLock);
130*38e8c45fSAndroid Build Coastguard Worker android::base::ScopedLockAssertion assumeLocked(mLock);
131*38e8c45fSAndroid Build Coastguard Worker AnrResult result = getAnrTokenLockedInterruptible(0s, mResponsiveWindows, lock);
132*38e8c45fSAndroid Build Coastguard Worker const auto& [token, _] = result;
133*38e8c45fSAndroid Build Coastguard Worker return token;
134*38e8c45fSAndroid Build Coastguard Worker }
135*38e8c45fSAndroid Build Coastguard Worker
assertNotifyAnrWasNotCalled()136*38e8c45fSAndroid Build Coastguard Worker void FakeInputDispatcherPolicy::assertNotifyAnrWasNotCalled() {
137*38e8c45fSAndroid Build Coastguard Worker std::scoped_lock lock(mLock);
138*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(mAnrApplications.empty());
139*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(mAnrWindows.empty());
140*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(mResponsiveWindows.empty())
141*38e8c45fSAndroid Build Coastguard Worker << "ANR was not called, but please also consume the 'connection is responsive' "
142*38e8c45fSAndroid Build Coastguard Worker "signal";
143*38e8c45fSAndroid Build Coastguard Worker }
144*38e8c45fSAndroid Build Coastguard Worker
assertSetPointerCaptureCalled(const sp<gui::WindowInfoHandle> & window,bool enabled)145*38e8c45fSAndroid Build Coastguard Worker PointerCaptureRequest FakeInputDispatcherPolicy::assertSetPointerCaptureCalled(
146*38e8c45fSAndroid Build Coastguard Worker const sp<gui::WindowInfoHandle>& window, bool enabled) {
147*38e8c45fSAndroid Build Coastguard Worker std::unique_lock lock(mLock);
148*38e8c45fSAndroid Build Coastguard Worker base::ScopedLockAssertion assumeLocked(mLock);
149*38e8c45fSAndroid Build Coastguard Worker
150*38e8c45fSAndroid Build Coastguard Worker if (!mPointerCaptureChangedCondition
151*38e8c45fSAndroid Build Coastguard Worker .wait_for(lock, 100ms, [this, enabled, window]() REQUIRES(mLock) {
152*38e8c45fSAndroid Build Coastguard Worker if (enabled) {
153*38e8c45fSAndroid Build Coastguard Worker return mPointerCaptureRequest->isEnable() &&
154*38e8c45fSAndroid Build Coastguard Worker mPointerCaptureRequest->window == window->getToken();
155*38e8c45fSAndroid Build Coastguard Worker } else {
156*38e8c45fSAndroid Build Coastguard Worker return !mPointerCaptureRequest->isEnable();
157*38e8c45fSAndroid Build Coastguard Worker }
158*38e8c45fSAndroid Build Coastguard Worker })) {
159*38e8c45fSAndroid Build Coastguard Worker ADD_FAILURE() << "Timed out waiting for setPointerCapture(" << window->getName() << ", "
160*38e8c45fSAndroid Build Coastguard Worker << enabled << ") to be called.";
161*38e8c45fSAndroid Build Coastguard Worker return {};
162*38e8c45fSAndroid Build Coastguard Worker }
163*38e8c45fSAndroid Build Coastguard Worker auto request = *mPointerCaptureRequest;
164*38e8c45fSAndroid Build Coastguard Worker mPointerCaptureRequest.reset();
165*38e8c45fSAndroid Build Coastguard Worker return request;
166*38e8c45fSAndroid Build Coastguard Worker }
167*38e8c45fSAndroid Build Coastguard Worker
assertSetPointerCaptureNotCalled()168*38e8c45fSAndroid Build Coastguard Worker void FakeInputDispatcherPolicy::assertSetPointerCaptureNotCalled() {
169*38e8c45fSAndroid Build Coastguard Worker std::unique_lock lock(mLock);
170*38e8c45fSAndroid Build Coastguard Worker base::ScopedLockAssertion assumeLocked(mLock);
171*38e8c45fSAndroid Build Coastguard Worker
172*38e8c45fSAndroid Build Coastguard Worker if (mPointerCaptureChangedCondition.wait_for(lock, 100ms) != std::cv_status::timeout) {
173*38e8c45fSAndroid Build Coastguard Worker FAIL() << "Expected setPointerCapture(request) to not be called, but was called. "
174*38e8c45fSAndroid Build Coastguard Worker "enabled = "
175*38e8c45fSAndroid Build Coastguard Worker << std::to_string(mPointerCaptureRequest->isEnable());
176*38e8c45fSAndroid Build Coastguard Worker }
177*38e8c45fSAndroid Build Coastguard Worker mPointerCaptureRequest.reset();
178*38e8c45fSAndroid Build Coastguard Worker }
179*38e8c45fSAndroid Build Coastguard Worker
assertDropTargetEquals(const InputDispatcherInterface & dispatcher,const sp<IBinder> & targetToken)180*38e8c45fSAndroid Build Coastguard Worker void FakeInputDispatcherPolicy::assertDropTargetEquals(const InputDispatcherInterface& dispatcher,
181*38e8c45fSAndroid Build Coastguard Worker const sp<IBinder>& targetToken) {
182*38e8c45fSAndroid Build Coastguard Worker dispatcher.waitForIdle();
183*38e8c45fSAndroid Build Coastguard Worker std::scoped_lock lock(mLock);
184*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(mNotifyDropWindowWasCalled);
185*38e8c45fSAndroid Build Coastguard Worker ASSERT_EQ(targetToken, mDropTargetWindowToken);
186*38e8c45fSAndroid Build Coastguard Worker mNotifyDropWindowWasCalled = false;
187*38e8c45fSAndroid Build Coastguard Worker }
188*38e8c45fSAndroid Build Coastguard Worker
assertNotifyInputChannelBrokenWasCalled(const sp<IBinder> & token)189*38e8c45fSAndroid Build Coastguard Worker void FakeInputDispatcherPolicy::assertNotifyInputChannelBrokenWasCalled(const sp<IBinder>& token) {
190*38e8c45fSAndroid Build Coastguard Worker std::unique_lock lock(mLock);
191*38e8c45fSAndroid Build Coastguard Worker base::ScopedLockAssertion assumeLocked(mLock);
192*38e8c45fSAndroid Build Coastguard Worker std::optional<sp<IBinder>> receivedToken =
193*38e8c45fSAndroid Build Coastguard Worker getItemFromStorageLockedInterruptible(100ms, mBrokenInputChannels, lock,
194*38e8c45fSAndroid Build Coastguard Worker mNotifyInputChannelBroken);
195*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(receivedToken.has_value()) << "Did not receive the broken channel token";
196*38e8c45fSAndroid Build Coastguard Worker ASSERT_EQ(token, *receivedToken);
197*38e8c45fSAndroid Build Coastguard Worker }
198*38e8c45fSAndroid Build Coastguard Worker
setInterceptKeyTimeout(std::chrono::milliseconds timeout)199*38e8c45fSAndroid Build Coastguard Worker void FakeInputDispatcherPolicy::setInterceptKeyTimeout(std::chrono::milliseconds timeout) {
200*38e8c45fSAndroid Build Coastguard Worker mInterceptKeyTimeout = timeout;
201*38e8c45fSAndroid Build Coastguard Worker }
202*38e8c45fSAndroid Build Coastguard Worker
getKeyWaitingForEventsTimeout()203*38e8c45fSAndroid Build Coastguard Worker std::chrono::nanoseconds FakeInputDispatcherPolicy::getKeyWaitingForEventsTimeout() {
204*38e8c45fSAndroid Build Coastguard Worker return 500ms;
205*38e8c45fSAndroid Build Coastguard Worker }
206*38e8c45fSAndroid Build Coastguard Worker
setStaleEventTimeout(std::chrono::nanoseconds timeout)207*38e8c45fSAndroid Build Coastguard Worker void FakeInputDispatcherPolicy::setStaleEventTimeout(std::chrono::nanoseconds timeout) {
208*38e8c45fSAndroid Build Coastguard Worker mStaleEventTimeout = timeout;
209*38e8c45fSAndroid Build Coastguard Worker }
210*38e8c45fSAndroid Build Coastguard Worker
setConsumeKeyBeforeDispatching(bool consumeKeyBeforeDispatching)211*38e8c45fSAndroid Build Coastguard Worker void FakeInputDispatcherPolicy::setConsumeKeyBeforeDispatching(bool consumeKeyBeforeDispatching) {
212*38e8c45fSAndroid Build Coastguard Worker mConsumeKeyBeforeDispatching = consumeKeyBeforeDispatching;
213*38e8c45fSAndroid Build Coastguard Worker }
214*38e8c45fSAndroid Build Coastguard Worker
assertFocusedDisplayNotified(ui::LogicalDisplayId expectedDisplay)215*38e8c45fSAndroid Build Coastguard Worker void FakeInputDispatcherPolicy::assertFocusedDisplayNotified(ui::LogicalDisplayId expectedDisplay) {
216*38e8c45fSAndroid Build Coastguard Worker std::unique_lock lock(mLock);
217*38e8c45fSAndroid Build Coastguard Worker base::ScopedLockAssertion assumeLocked(mLock);
218*38e8c45fSAndroid Build Coastguard Worker
219*38e8c45fSAndroid Build Coastguard Worker if (!mFocusedDisplayNotifiedCondition.wait_for(lock, 100ms,
220*38e8c45fSAndroid Build Coastguard Worker [this, expectedDisplay]() REQUIRES(mLock) {
221*38e8c45fSAndroid Build Coastguard Worker if (!mNotifiedFocusedDisplay.has_value() ||
222*38e8c45fSAndroid Build Coastguard Worker mNotifiedFocusedDisplay.value() !=
223*38e8c45fSAndroid Build Coastguard Worker expectedDisplay) {
224*38e8c45fSAndroid Build Coastguard Worker return false;
225*38e8c45fSAndroid Build Coastguard Worker }
226*38e8c45fSAndroid Build Coastguard Worker return true;
227*38e8c45fSAndroid Build Coastguard Worker })) {
228*38e8c45fSAndroid Build Coastguard Worker ADD_FAILURE() << "Timed out waiting for notifyFocusedDisplayChanged(" << expectedDisplay
229*38e8c45fSAndroid Build Coastguard Worker << ") to be called.";
230*38e8c45fSAndroid Build Coastguard Worker }
231*38e8c45fSAndroid Build Coastguard Worker }
232*38e8c45fSAndroid Build Coastguard Worker
assertUserActivityNotPoked()233*38e8c45fSAndroid Build Coastguard Worker void FakeInputDispatcherPolicy::assertUserActivityNotPoked() {
234*38e8c45fSAndroid Build Coastguard Worker std::unique_lock lock(mLock);
235*38e8c45fSAndroid Build Coastguard Worker base::ScopedLockAssertion assumeLocked(mLock);
236*38e8c45fSAndroid Build Coastguard Worker
237*38e8c45fSAndroid Build Coastguard Worker std::optional<UserActivityPokeEvent> pokeEvent =
238*38e8c45fSAndroid Build Coastguard Worker getItemFromStorageLockedInterruptible(500ms, mUserActivityPokeEvents, lock,
239*38e8c45fSAndroid Build Coastguard Worker mNotifyUserActivity);
240*38e8c45fSAndroid Build Coastguard Worker
241*38e8c45fSAndroid Build Coastguard Worker ASSERT_FALSE(pokeEvent) << "Expected user activity not to have been poked";
242*38e8c45fSAndroid Build Coastguard Worker }
243*38e8c45fSAndroid Build Coastguard Worker
assertUserActivityPoked(std::optional<UserActivityPokeEvent> expectedPokeEvent)244*38e8c45fSAndroid Build Coastguard Worker void FakeInputDispatcherPolicy::assertUserActivityPoked(
245*38e8c45fSAndroid Build Coastguard Worker std::optional<UserActivityPokeEvent> expectedPokeEvent) {
246*38e8c45fSAndroid Build Coastguard Worker std::unique_lock lock(mLock);
247*38e8c45fSAndroid Build Coastguard Worker base::ScopedLockAssertion assumeLocked(mLock);
248*38e8c45fSAndroid Build Coastguard Worker
249*38e8c45fSAndroid Build Coastguard Worker std::optional<UserActivityPokeEvent> pokeEvent =
250*38e8c45fSAndroid Build Coastguard Worker getItemFromStorageLockedInterruptible(500ms, mUserActivityPokeEvents, lock,
251*38e8c45fSAndroid Build Coastguard Worker mNotifyUserActivity);
252*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(pokeEvent) << "Expected a user poke event";
253*38e8c45fSAndroid Build Coastguard Worker
254*38e8c45fSAndroid Build Coastguard Worker if (expectedPokeEvent) {
255*38e8c45fSAndroid Build Coastguard Worker ASSERT_EQ(expectedPokeEvent, *pokeEvent);
256*38e8c45fSAndroid Build Coastguard Worker }
257*38e8c45fSAndroid Build Coastguard Worker }
258*38e8c45fSAndroid Build Coastguard Worker
assertNotifyDeviceInteractionWasCalled(int32_t deviceId,std::set<gui::Uid> uids)259*38e8c45fSAndroid Build Coastguard Worker void FakeInputDispatcherPolicy::assertNotifyDeviceInteractionWasCalled(int32_t deviceId,
260*38e8c45fSAndroid Build Coastguard Worker std::set<gui::Uid> uids) {
261*38e8c45fSAndroid Build Coastguard Worker ASSERT_EQ(std::make_pair(deviceId, uids), mNotifiedInteractions.popWithTimeout(100ms));
262*38e8c45fSAndroid Build Coastguard Worker }
263*38e8c45fSAndroid Build Coastguard Worker
assertNotifyDeviceInteractionWasNotCalled()264*38e8c45fSAndroid Build Coastguard Worker void FakeInputDispatcherPolicy::assertNotifyDeviceInteractionWasNotCalled() {
265*38e8c45fSAndroid Build Coastguard Worker ASSERT_FALSE(mNotifiedInteractions.popWithTimeout(10ms));
266*38e8c45fSAndroid Build Coastguard Worker }
267*38e8c45fSAndroid Build Coastguard Worker
setUnhandledKeyHandler(std::function<std::optional<KeyEvent> (const KeyEvent &)> handler)268*38e8c45fSAndroid Build Coastguard Worker void FakeInputDispatcherPolicy::setUnhandledKeyHandler(
269*38e8c45fSAndroid Build Coastguard Worker std::function<std::optional<KeyEvent>(const KeyEvent&)> handler) {
270*38e8c45fSAndroid Build Coastguard Worker std::scoped_lock lock(mLock);
271*38e8c45fSAndroid Build Coastguard Worker mUnhandledKeyHandler = handler;
272*38e8c45fSAndroid Build Coastguard Worker }
273*38e8c45fSAndroid Build Coastguard Worker
assertUnhandledKeyReported(int32_t keycode)274*38e8c45fSAndroid Build Coastguard Worker void FakeInputDispatcherPolicy::assertUnhandledKeyReported(int32_t keycode) {
275*38e8c45fSAndroid Build Coastguard Worker std::unique_lock lock(mLock);
276*38e8c45fSAndroid Build Coastguard Worker base::ScopedLockAssertion assumeLocked(mLock);
277*38e8c45fSAndroid Build Coastguard Worker std::optional<int32_t> unhandledKeycode =
278*38e8c45fSAndroid Build Coastguard Worker getItemFromStorageLockedInterruptible(100ms, mReportedUnhandledKeycodes, lock,
279*38e8c45fSAndroid Build Coastguard Worker mNotifyUnhandledKey);
280*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(unhandledKeycode) << "Expected unhandled key to be reported";
281*38e8c45fSAndroid Build Coastguard Worker ASSERT_EQ(unhandledKeycode, keycode);
282*38e8c45fSAndroid Build Coastguard Worker }
283*38e8c45fSAndroid Build Coastguard Worker
assertUnhandledKeyNotReported()284*38e8c45fSAndroid Build Coastguard Worker void FakeInputDispatcherPolicy::assertUnhandledKeyNotReported() {
285*38e8c45fSAndroid Build Coastguard Worker std::unique_lock lock(mLock);
286*38e8c45fSAndroid Build Coastguard Worker base::ScopedLockAssertion assumeLocked(mLock);
287*38e8c45fSAndroid Build Coastguard Worker std::optional<int32_t> unhandledKeycode =
288*38e8c45fSAndroid Build Coastguard Worker getItemFromStorageLockedInterruptible(10ms, mReportedUnhandledKeycodes, lock,
289*38e8c45fSAndroid Build Coastguard Worker mNotifyUnhandledKey);
290*38e8c45fSAndroid Build Coastguard Worker ASSERT_FALSE(unhandledKeycode) << "Expected unhandled key NOT to be reported";
291*38e8c45fSAndroid Build Coastguard Worker }
292*38e8c45fSAndroid Build Coastguard Worker
293*38e8c45fSAndroid Build Coastguard Worker template <class T>
getAnrTokenLockedInterruptible(std::chrono::nanoseconds timeout,std::queue<T> & storage,std::unique_lock<std::mutex> & lock)294*38e8c45fSAndroid Build Coastguard Worker T FakeInputDispatcherPolicy::getAnrTokenLockedInterruptible(std::chrono::nanoseconds timeout,
295*38e8c45fSAndroid Build Coastguard Worker std::queue<T>& storage,
296*38e8c45fSAndroid Build Coastguard Worker std::unique_lock<std::mutex>& lock)
297*38e8c45fSAndroid Build Coastguard Worker REQUIRES(mLock) {
298*38e8c45fSAndroid Build Coastguard Worker // If there is an ANR, Dispatcher won't be idle because there are still events
299*38e8c45fSAndroid Build Coastguard Worker // in the waitQueue that we need to check on. So we can't wait for dispatcher to be idle
300*38e8c45fSAndroid Build Coastguard Worker // before checking if ANR was called.
301*38e8c45fSAndroid Build Coastguard Worker // Since dispatcher is not guaranteed to call notifyNoFocusedWindowAnr right away, we need
302*38e8c45fSAndroid Build Coastguard Worker // to provide it some time to act. 100ms seems reasonable.
303*38e8c45fSAndroid Build Coastguard Worker std::chrono::duration timeToWait = timeout + 100ms; // provide some slack
304*38e8c45fSAndroid Build Coastguard Worker const std::chrono::time_point start = std::chrono::steady_clock::now();
305*38e8c45fSAndroid Build Coastguard Worker std::optional<T> token =
306*38e8c45fSAndroid Build Coastguard Worker getItemFromStorageLockedInterruptible(timeToWait, storage, lock, mNotifyAnr);
307*38e8c45fSAndroid Build Coastguard Worker if (!token.has_value()) {
308*38e8c45fSAndroid Build Coastguard Worker ADD_FAILURE() << "Did not receive the ANR callback";
309*38e8c45fSAndroid Build Coastguard Worker return {};
310*38e8c45fSAndroid Build Coastguard Worker }
311*38e8c45fSAndroid Build Coastguard Worker
312*38e8c45fSAndroid Build Coastguard Worker const std::chrono::duration waited = std::chrono::steady_clock::now() - start;
313*38e8c45fSAndroid Build Coastguard Worker // Ensure that the ANR didn't get raised too early. We can't be too strict here because
314*38e8c45fSAndroid Build Coastguard Worker // the dispatcher started counting before this function was called
315*38e8c45fSAndroid Build Coastguard Worker if (std::chrono::abs(timeout - waited) > 100ms) {
316*38e8c45fSAndroid Build Coastguard Worker ADD_FAILURE() << "ANR was raised too early or too late. Expected "
317*38e8c45fSAndroid Build Coastguard Worker << std::chrono::duration_cast<std::chrono::milliseconds>(timeout).count()
318*38e8c45fSAndroid Build Coastguard Worker << "ms, but waited "
319*38e8c45fSAndroid Build Coastguard Worker << std::chrono::duration_cast<std::chrono::milliseconds>(waited).count()
320*38e8c45fSAndroid Build Coastguard Worker << "ms instead";
321*38e8c45fSAndroid Build Coastguard Worker }
322*38e8c45fSAndroid Build Coastguard Worker return *token;
323*38e8c45fSAndroid Build Coastguard Worker }
324*38e8c45fSAndroid Build Coastguard Worker
325*38e8c45fSAndroid Build Coastguard Worker template <class T>
getItemFromStorageLockedInterruptible(std::chrono::nanoseconds timeout,std::queue<T> & storage,std::unique_lock<std::mutex> & lock,std::condition_variable & condition)326*38e8c45fSAndroid Build Coastguard Worker std::optional<T> FakeInputDispatcherPolicy::getItemFromStorageLockedInterruptible(
327*38e8c45fSAndroid Build Coastguard Worker std::chrono::nanoseconds timeout, std::queue<T>& storage,
328*38e8c45fSAndroid Build Coastguard Worker std::unique_lock<std::mutex>& lock, std::condition_variable& condition) REQUIRES(mLock) {
329*38e8c45fSAndroid Build Coastguard Worker condition.wait_for(lock, timeout, [&storage]() REQUIRES(mLock) { return !storage.empty(); });
330*38e8c45fSAndroid Build Coastguard Worker if (storage.empty()) {
331*38e8c45fSAndroid Build Coastguard Worker return std::nullopt;
332*38e8c45fSAndroid Build Coastguard Worker }
333*38e8c45fSAndroid Build Coastguard Worker T item = storage.front();
334*38e8c45fSAndroid Build Coastguard Worker storage.pop();
335*38e8c45fSAndroid Build Coastguard Worker return std::make_optional(item);
336*38e8c45fSAndroid Build Coastguard Worker }
337*38e8c45fSAndroid Build Coastguard Worker
notifyWindowUnresponsive(const sp<IBinder> & connectionToken,std::optional<gui::Pid> pid,const std::string &)338*38e8c45fSAndroid Build Coastguard Worker void FakeInputDispatcherPolicy::notifyWindowUnresponsive(const sp<IBinder>& connectionToken,
339*38e8c45fSAndroid Build Coastguard Worker std::optional<gui::Pid> pid,
340*38e8c45fSAndroid Build Coastguard Worker const std::string&) {
341*38e8c45fSAndroid Build Coastguard Worker std::scoped_lock lock(mLock);
342*38e8c45fSAndroid Build Coastguard Worker mAnrWindows.push({connectionToken, pid});
343*38e8c45fSAndroid Build Coastguard Worker mNotifyAnr.notify_all();
344*38e8c45fSAndroid Build Coastguard Worker }
345*38e8c45fSAndroid Build Coastguard Worker
notifyWindowResponsive(const sp<IBinder> & connectionToken,std::optional<gui::Pid> pid)346*38e8c45fSAndroid Build Coastguard Worker void FakeInputDispatcherPolicy::notifyWindowResponsive(const sp<IBinder>& connectionToken,
347*38e8c45fSAndroid Build Coastguard Worker std::optional<gui::Pid> pid) {
348*38e8c45fSAndroid Build Coastguard Worker std::scoped_lock lock(mLock);
349*38e8c45fSAndroid Build Coastguard Worker mResponsiveWindows.push({connectionToken, pid});
350*38e8c45fSAndroid Build Coastguard Worker mNotifyAnr.notify_all();
351*38e8c45fSAndroid Build Coastguard Worker }
352*38e8c45fSAndroid Build Coastguard Worker
notifyNoFocusedWindowAnr(const std::shared_ptr<InputApplicationHandle> & applicationHandle)353*38e8c45fSAndroid Build Coastguard Worker void FakeInputDispatcherPolicy::notifyNoFocusedWindowAnr(
354*38e8c45fSAndroid Build Coastguard Worker const std::shared_ptr<InputApplicationHandle>& applicationHandle) {
355*38e8c45fSAndroid Build Coastguard Worker std::scoped_lock lock(mLock);
356*38e8c45fSAndroid Build Coastguard Worker mAnrApplications.push(applicationHandle);
357*38e8c45fSAndroid Build Coastguard Worker mNotifyAnr.notify_all();
358*38e8c45fSAndroid Build Coastguard Worker }
359*38e8c45fSAndroid Build Coastguard Worker
notifyInputChannelBroken(const sp<IBinder> & connectionToken)360*38e8c45fSAndroid Build Coastguard Worker void FakeInputDispatcherPolicy::notifyInputChannelBroken(const sp<IBinder>& connectionToken) {
361*38e8c45fSAndroid Build Coastguard Worker std::scoped_lock lock(mLock);
362*38e8c45fSAndroid Build Coastguard Worker mBrokenInputChannels.push(connectionToken);
363*38e8c45fSAndroid Build Coastguard Worker mNotifyInputChannelBroken.notify_all();
364*38e8c45fSAndroid Build Coastguard Worker }
365*38e8c45fSAndroid Build Coastguard Worker
notifyFocusChanged(const sp<IBinder> &,const sp<IBinder> &)366*38e8c45fSAndroid Build Coastguard Worker void FakeInputDispatcherPolicy::notifyFocusChanged(const sp<IBinder>&, const sp<IBinder>&) {}
367*38e8c45fSAndroid Build Coastguard Worker
notifySensorEvent(int32_t deviceId,InputDeviceSensorType sensorType,InputDeviceSensorAccuracy accuracy,nsecs_t timestamp,const std::vector<float> & values)368*38e8c45fSAndroid Build Coastguard Worker void FakeInputDispatcherPolicy::notifySensorEvent(int32_t deviceId,
369*38e8c45fSAndroid Build Coastguard Worker InputDeviceSensorType sensorType,
370*38e8c45fSAndroid Build Coastguard Worker InputDeviceSensorAccuracy accuracy,
371*38e8c45fSAndroid Build Coastguard Worker nsecs_t timestamp,
372*38e8c45fSAndroid Build Coastguard Worker const std::vector<float>& values) {}
373*38e8c45fSAndroid Build Coastguard Worker
notifySensorAccuracy(int deviceId,InputDeviceSensorType sensorType,InputDeviceSensorAccuracy accuracy)374*38e8c45fSAndroid Build Coastguard Worker void FakeInputDispatcherPolicy::notifySensorAccuracy(int deviceId, InputDeviceSensorType sensorType,
375*38e8c45fSAndroid Build Coastguard Worker InputDeviceSensorAccuracy accuracy) {}
376*38e8c45fSAndroid Build Coastguard Worker
notifyVibratorState(int32_t deviceId,bool isOn)377*38e8c45fSAndroid Build Coastguard Worker void FakeInputDispatcherPolicy::notifyVibratorState(int32_t deviceId, bool isOn) {}
378*38e8c45fSAndroid Build Coastguard Worker
filterInputEvent(const InputEvent & inputEvent,uint32_t policyFlags)379*38e8c45fSAndroid Build Coastguard Worker bool FakeInputDispatcherPolicy::filterInputEvent(const InputEvent& inputEvent,
380*38e8c45fSAndroid Build Coastguard Worker uint32_t policyFlags) {
381*38e8c45fSAndroid Build Coastguard Worker std::scoped_lock lock(mLock);
382*38e8c45fSAndroid Build Coastguard Worker switch (inputEvent.getType()) {
383*38e8c45fSAndroid Build Coastguard Worker case InputEventType::KEY: {
384*38e8c45fSAndroid Build Coastguard Worker const KeyEvent& keyEvent = static_cast<const KeyEvent&>(inputEvent);
385*38e8c45fSAndroid Build Coastguard Worker mFilteredEvent = std::make_unique<KeyEvent>(keyEvent);
386*38e8c45fSAndroid Build Coastguard Worker break;
387*38e8c45fSAndroid Build Coastguard Worker }
388*38e8c45fSAndroid Build Coastguard Worker
389*38e8c45fSAndroid Build Coastguard Worker case InputEventType::MOTION: {
390*38e8c45fSAndroid Build Coastguard Worker const MotionEvent& motionEvent = static_cast<const MotionEvent&>(inputEvent);
391*38e8c45fSAndroid Build Coastguard Worker mFilteredEvent = std::make_unique<MotionEvent>(motionEvent);
392*38e8c45fSAndroid Build Coastguard Worker break;
393*38e8c45fSAndroid Build Coastguard Worker }
394*38e8c45fSAndroid Build Coastguard Worker default: {
395*38e8c45fSAndroid Build Coastguard Worker ADD_FAILURE() << "Should only filter keys or motions";
396*38e8c45fSAndroid Build Coastguard Worker break;
397*38e8c45fSAndroid Build Coastguard Worker }
398*38e8c45fSAndroid Build Coastguard Worker }
399*38e8c45fSAndroid Build Coastguard Worker return true;
400*38e8c45fSAndroid Build Coastguard Worker }
401*38e8c45fSAndroid Build Coastguard Worker
interceptKeyBeforeQueueing(const KeyEvent & inputEvent,uint32_t &)402*38e8c45fSAndroid Build Coastguard Worker void FakeInputDispatcherPolicy::interceptKeyBeforeQueueing(const KeyEvent& inputEvent, uint32_t&) {
403*38e8c45fSAndroid Build Coastguard Worker if (inputEvent.getAction() == AKEY_EVENT_ACTION_UP) {
404*38e8c45fSAndroid Build Coastguard Worker // Clear intercept state when we handled the event.
405*38e8c45fSAndroid Build Coastguard Worker mInterceptKeyTimeout = 0ms;
406*38e8c45fSAndroid Build Coastguard Worker }
407*38e8c45fSAndroid Build Coastguard Worker }
408*38e8c45fSAndroid Build Coastguard Worker
interceptMotionBeforeQueueing(ui::LogicalDisplayId,uint32_t,int32_t,nsecs_t,uint32_t &)409*38e8c45fSAndroid Build Coastguard Worker void FakeInputDispatcherPolicy::interceptMotionBeforeQueueing(ui::LogicalDisplayId, uint32_t,
410*38e8c45fSAndroid Build Coastguard Worker int32_t, nsecs_t, uint32_t&) {}
411*38e8c45fSAndroid Build Coastguard Worker
interceptKeyBeforeDispatching(const sp<IBinder> &,const KeyEvent &,uint32_t)412*38e8c45fSAndroid Build Coastguard Worker nsecs_t FakeInputDispatcherPolicy::interceptKeyBeforeDispatching(const sp<IBinder>&,
413*38e8c45fSAndroid Build Coastguard Worker const KeyEvent&, uint32_t) {
414*38e8c45fSAndroid Build Coastguard Worker if (mConsumeKeyBeforeDispatching) {
415*38e8c45fSAndroid Build Coastguard Worker return -1;
416*38e8c45fSAndroid Build Coastguard Worker }
417*38e8c45fSAndroid Build Coastguard Worker nsecs_t delay = std::chrono::nanoseconds(mInterceptKeyTimeout).count();
418*38e8c45fSAndroid Build Coastguard Worker // Clear intercept state so we could dispatch the event in next wake.
419*38e8c45fSAndroid Build Coastguard Worker mInterceptKeyTimeout = 0ms;
420*38e8c45fSAndroid Build Coastguard Worker return delay;
421*38e8c45fSAndroid Build Coastguard Worker }
422*38e8c45fSAndroid Build Coastguard Worker
dispatchUnhandledKey(const sp<IBinder> &,const KeyEvent & event,uint32_t)423*38e8c45fSAndroid Build Coastguard Worker std::optional<KeyEvent> FakeInputDispatcherPolicy::dispatchUnhandledKey(const sp<IBinder>&,
424*38e8c45fSAndroid Build Coastguard Worker const KeyEvent& event,
425*38e8c45fSAndroid Build Coastguard Worker uint32_t) {
426*38e8c45fSAndroid Build Coastguard Worker std::scoped_lock lock(mLock);
427*38e8c45fSAndroid Build Coastguard Worker mReportedUnhandledKeycodes.emplace(event.getKeyCode());
428*38e8c45fSAndroid Build Coastguard Worker mNotifyUnhandledKey.notify_all();
429*38e8c45fSAndroid Build Coastguard Worker return mUnhandledKeyHandler != nullptr ? mUnhandledKeyHandler(event) : std::nullopt;
430*38e8c45fSAndroid Build Coastguard Worker }
431*38e8c45fSAndroid Build Coastguard Worker
notifySwitch(nsecs_t when,uint32_t switchValues,uint32_t switchMask,uint32_t policyFlags)432*38e8c45fSAndroid Build Coastguard Worker void FakeInputDispatcherPolicy::notifySwitch(nsecs_t when, uint32_t switchValues,
433*38e8c45fSAndroid Build Coastguard Worker uint32_t switchMask, uint32_t policyFlags) {
434*38e8c45fSAndroid Build Coastguard Worker std::scoped_lock lock(mLock);
435*38e8c45fSAndroid Build Coastguard Worker // We simply reconstruct NotifySwitchArgs in policy because InputDispatcher is
436*38e8c45fSAndroid Build Coastguard Worker // essentially a passthrough for notifySwitch.
437*38e8c45fSAndroid Build Coastguard Worker mLastNotifySwitch =
438*38e8c45fSAndroid Build Coastguard Worker NotifySwitchArgs(InputEvent::nextId(), when, policyFlags, switchValues, switchMask);
439*38e8c45fSAndroid Build Coastguard Worker }
440*38e8c45fSAndroid Build Coastguard Worker
pokeUserActivity(nsecs_t eventTime,int32_t eventType,ui::LogicalDisplayId displayId)441*38e8c45fSAndroid Build Coastguard Worker void FakeInputDispatcherPolicy::pokeUserActivity(nsecs_t eventTime, int32_t eventType,
442*38e8c45fSAndroid Build Coastguard Worker ui::LogicalDisplayId displayId) {
443*38e8c45fSAndroid Build Coastguard Worker std::scoped_lock lock(mLock);
444*38e8c45fSAndroid Build Coastguard Worker mNotifyUserActivity.notify_all();
445*38e8c45fSAndroid Build Coastguard Worker mUserActivityPokeEvents.push({eventTime, eventType, displayId});
446*38e8c45fSAndroid Build Coastguard Worker }
447*38e8c45fSAndroid Build Coastguard Worker
isStaleEvent(nsecs_t currentTime,nsecs_t eventTime)448*38e8c45fSAndroid Build Coastguard Worker bool FakeInputDispatcherPolicy::isStaleEvent(nsecs_t currentTime, nsecs_t eventTime) {
449*38e8c45fSAndroid Build Coastguard Worker return std::chrono::nanoseconds(currentTime - eventTime) >= mStaleEventTimeout;
450*38e8c45fSAndroid Build Coastguard Worker }
451*38e8c45fSAndroid Build Coastguard Worker
onPointerDownOutsideFocus(const sp<IBinder> & newToken)452*38e8c45fSAndroid Build Coastguard Worker void FakeInputDispatcherPolicy::onPointerDownOutsideFocus(const sp<IBinder>& newToken) {
453*38e8c45fSAndroid Build Coastguard Worker std::scoped_lock lock(mLock);
454*38e8c45fSAndroid Build Coastguard Worker mOnPointerDownToken = newToken;
455*38e8c45fSAndroid Build Coastguard Worker }
456*38e8c45fSAndroid Build Coastguard Worker
setPointerCapture(const PointerCaptureRequest & request)457*38e8c45fSAndroid Build Coastguard Worker void FakeInputDispatcherPolicy::setPointerCapture(const PointerCaptureRequest& request) {
458*38e8c45fSAndroid Build Coastguard Worker std::scoped_lock lock(mLock);
459*38e8c45fSAndroid Build Coastguard Worker mPointerCaptureRequest = {request};
460*38e8c45fSAndroid Build Coastguard Worker mPointerCaptureChangedCondition.notify_all();
461*38e8c45fSAndroid Build Coastguard Worker }
462*38e8c45fSAndroid Build Coastguard Worker
notifyDropWindow(const sp<IBinder> & token,float x,float y)463*38e8c45fSAndroid Build Coastguard Worker void FakeInputDispatcherPolicy::notifyDropWindow(const sp<IBinder>& token, float x, float y) {
464*38e8c45fSAndroid Build Coastguard Worker std::scoped_lock lock(mLock);
465*38e8c45fSAndroid Build Coastguard Worker mNotifyDropWindowWasCalled = true;
466*38e8c45fSAndroid Build Coastguard Worker mDropTargetWindowToken = token;
467*38e8c45fSAndroid Build Coastguard Worker }
468*38e8c45fSAndroid Build Coastguard Worker
notifyDeviceInteraction(int32_t deviceId,nsecs_t timestamp,const std::set<gui::Uid> & uids)469*38e8c45fSAndroid Build Coastguard Worker void FakeInputDispatcherPolicy::notifyDeviceInteraction(int32_t deviceId, nsecs_t timestamp,
470*38e8c45fSAndroid Build Coastguard Worker const std::set<gui::Uid>& uids) {
471*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(mNotifiedInteractions.emplace(deviceId, uids));
472*38e8c45fSAndroid Build Coastguard Worker }
473*38e8c45fSAndroid Build Coastguard Worker
assertFilterInputEventWasCalledInternal(const std::function<void (const InputEvent &)> & verify)474*38e8c45fSAndroid Build Coastguard Worker void FakeInputDispatcherPolicy::assertFilterInputEventWasCalledInternal(
475*38e8c45fSAndroid Build Coastguard Worker const std::function<void(const InputEvent&)>& verify) {
476*38e8c45fSAndroid Build Coastguard Worker std::scoped_lock lock(mLock);
477*38e8c45fSAndroid Build Coastguard Worker ASSERT_NE(nullptr, mFilteredEvent) << "Expected filterInputEvent() to have been called.";
478*38e8c45fSAndroid Build Coastguard Worker verify(*mFilteredEvent);
479*38e8c45fSAndroid Build Coastguard Worker mFilteredEvent = nullptr;
480*38e8c45fSAndroid Build Coastguard Worker }
481*38e8c45fSAndroid Build Coastguard Worker
notifyFocusedDisplayChanged(ui::LogicalDisplayId displayId)482*38e8c45fSAndroid Build Coastguard Worker void FakeInputDispatcherPolicy::notifyFocusedDisplayChanged(ui::LogicalDisplayId displayId) {
483*38e8c45fSAndroid Build Coastguard Worker std::scoped_lock lock(mLock);
484*38e8c45fSAndroid Build Coastguard Worker mNotifiedFocusedDisplay = displayId;
485*38e8c45fSAndroid Build Coastguard Worker mFocusedDisplayNotifiedCondition.notify_all();
486*38e8c45fSAndroid Build Coastguard Worker }
487*38e8c45fSAndroid Build Coastguard Worker
488*38e8c45fSAndroid Build Coastguard Worker } // namespace android
489