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 "../InputCommonConverter.h"
18*38e8c45fSAndroid Build Coastguard Worker #include "../dispatcher/InputDispatcher.h"
19*38e8c45fSAndroid Build Coastguard Worker #include "../dispatcher/trace/InputTracingPerfettoBackend.h"
20*38e8c45fSAndroid Build Coastguard Worker #include "../dispatcher/trace/ThreadedBackend.h"
21*38e8c45fSAndroid Build Coastguard Worker #include "FakeApplicationHandle.h"
22*38e8c45fSAndroid Build Coastguard Worker #include "FakeInputDispatcherPolicy.h"
23*38e8c45fSAndroid Build Coastguard Worker #include "FakeWindows.h"
24*38e8c45fSAndroid Build Coastguard Worker #include "InputTraceSession.h"
25*38e8c45fSAndroid Build Coastguard Worker #include "TestEventMatchers.h"
26*38e8c45fSAndroid Build Coastguard Worker
27*38e8c45fSAndroid Build Coastguard Worker #include <NotifyArgsBuilders.h>
28*38e8c45fSAndroid Build Coastguard Worker #include <android-base/logging.h>
29*38e8c45fSAndroid Build Coastguard Worker #include <android/content/pm/IPackageManagerNative.h>
30*38e8c45fSAndroid Build Coastguard Worker #include <gtest/gtest.h>
31*38e8c45fSAndroid Build Coastguard Worker #include <input/Input.h>
32*38e8c45fSAndroid Build Coastguard Worker #include <perfetto/trace/android/android_input_event.pbzero.h>
33*38e8c45fSAndroid Build Coastguard Worker #include <perfetto/trace/android/winscope_extensions.pbzero.h>
34*38e8c45fSAndroid Build Coastguard Worker #include <perfetto/trace/android/winscope_extensions_impl.pbzero.h>
35*38e8c45fSAndroid Build Coastguard Worker #include <perfetto/trace/trace.pbzero.h>
36*38e8c45fSAndroid Build Coastguard Worker #include <private/android_filesystem_config.h>
37*38e8c45fSAndroid Build Coastguard Worker #include <map>
38*38e8c45fSAndroid Build Coastguard Worker #include <vector>
39*38e8c45fSAndroid Build Coastguard Worker
40*38e8c45fSAndroid Build Coastguard Worker namespace android::inputdispatcher::trace {
41*38e8c45fSAndroid Build Coastguard Worker
42*38e8c45fSAndroid Build Coastguard Worker using perfetto::protos::pbzero::AndroidInputEventConfig;
43*38e8c45fSAndroid Build Coastguard Worker
44*38e8c45fSAndroid Build Coastguard Worker namespace {
45*38e8c45fSAndroid Build Coastguard Worker
46*38e8c45fSAndroid Build Coastguard Worker constexpr ui::LogicalDisplayId DISPLAY_ID = ui::LogicalDisplayId::DEFAULT;
47*38e8c45fSAndroid Build Coastguard Worker
48*38e8c45fSAndroid Build Coastguard Worker // Ensure common actions are interchangeable between keys and motions for convenience.
49*38e8c45fSAndroid Build Coastguard Worker static_assert(static_cast<int32_t>(AMOTION_EVENT_ACTION_DOWN) ==
50*38e8c45fSAndroid Build Coastguard Worker static_cast<int32_t>(AKEY_EVENT_ACTION_DOWN));
51*38e8c45fSAndroid Build Coastguard Worker static_assert(static_cast<int32_t>(AMOTION_EVENT_ACTION_UP) ==
52*38e8c45fSAndroid Build Coastguard Worker static_cast<int32_t>(AKEY_EVENT_ACTION_UP));
53*38e8c45fSAndroid Build Coastguard Worker constexpr int32_t ACTION_DOWN = AMOTION_EVENT_ACTION_DOWN;
54*38e8c45fSAndroid Build Coastguard Worker constexpr int32_t ACTION_MOVE = AMOTION_EVENT_ACTION_MOVE;
55*38e8c45fSAndroid Build Coastguard Worker constexpr int32_t ACTION_UP = AMOTION_EVENT_ACTION_UP;
56*38e8c45fSAndroid Build Coastguard Worker constexpr int32_t ACTION_CANCEL = AMOTION_EVENT_ACTION_CANCEL;
57*38e8c45fSAndroid Build Coastguard Worker
58*38e8c45fSAndroid Build Coastguard Worker constexpr gui::Pid PID{1};
59*38e8c45fSAndroid Build Coastguard Worker
60*38e8c45fSAndroid Build Coastguard Worker constexpr gui::Uid ALLOWED_UID_1{10012};
61*38e8c45fSAndroid Build Coastguard Worker constexpr gui::Uid ALLOWED_UID_2{10013};
62*38e8c45fSAndroid Build Coastguard Worker constexpr gui::Uid DISALLOWED_UID_1{1};
63*38e8c45fSAndroid Build Coastguard Worker constexpr gui::Uid DISALLOWED_UID_2{99};
64*38e8c45fSAndroid Build Coastguard Worker constexpr gui::Uid UNLISTED_UID{12345};
65*38e8c45fSAndroid Build Coastguard Worker
66*38e8c45fSAndroid Build Coastguard Worker const std::string ALLOWED_PKG_1{"allowed.pkg.1"};
67*38e8c45fSAndroid Build Coastguard Worker const std::string ALLOWED_PKG_2{"allowed.pkg.2"};
68*38e8c45fSAndroid Build Coastguard Worker const std::string DISALLOWED_PKG_1{"disallowed.pkg.1"};
69*38e8c45fSAndroid Build Coastguard Worker const std::string DISALLOWED_PKG_2{"disallowed.pkg.2"};
70*38e8c45fSAndroid Build Coastguard Worker
71*38e8c45fSAndroid Build Coastguard Worker const std::map<std::string, gui::Uid> kPackageUidMap{
72*38e8c45fSAndroid Build Coastguard Worker {ALLOWED_PKG_1, ALLOWED_UID_1},
73*38e8c45fSAndroid Build Coastguard Worker {ALLOWED_PKG_2, ALLOWED_UID_2},
74*38e8c45fSAndroid Build Coastguard Worker {DISALLOWED_PKG_1, DISALLOWED_UID_1},
75*38e8c45fSAndroid Build Coastguard Worker {DISALLOWED_PKG_2, DISALLOWED_UID_2},
76*38e8c45fSAndroid Build Coastguard Worker };
77*38e8c45fSAndroid Build Coastguard Worker
78*38e8c45fSAndroid Build Coastguard Worker class FakePackageManager : public content::pm::IPackageManagerNativeDefault {
79*38e8c45fSAndroid Build Coastguard Worker public:
getPackageUid(const::std::string & pkg,int64_t flags,int32_t userId,int32_t * outUid)80*38e8c45fSAndroid Build Coastguard Worker binder::Status getPackageUid(const ::std::string& pkg, int64_t flags, int32_t userId,
81*38e8c45fSAndroid Build Coastguard Worker int32_t* outUid) override {
82*38e8c45fSAndroid Build Coastguard Worker auto it = kPackageUidMap.find(pkg);
83*38e8c45fSAndroid Build Coastguard Worker *outUid = it != kPackageUidMap.end() ? static_cast<int32_t>(it->second.val()) : -1;
84*38e8c45fSAndroid Build Coastguard Worker return binder::Status::ok();
85*38e8c45fSAndroid Build Coastguard Worker }
86*38e8c45fSAndroid Build Coastguard Worker };
87*38e8c45fSAndroid Build Coastguard Worker
88*38e8c45fSAndroid Build Coastguard Worker const sp<testing::NiceMock<FakePackageManager>> kPackageManager =
89*38e8c45fSAndroid Build Coastguard Worker sp<testing::NiceMock<FakePackageManager>>::make();
90*38e8c45fSAndroid Build Coastguard Worker
91*38e8c45fSAndroid Build Coastguard Worker const std::shared_ptr<FakeApplicationHandle> APP = std::make_shared<FakeApplicationHandle>();
92*38e8c45fSAndroid Build Coastguard Worker
93*38e8c45fSAndroid Build Coastguard Worker } // namespace
94*38e8c45fSAndroid Build Coastguard Worker
95*38e8c45fSAndroid Build Coastguard Worker // --- InputTracingTest ---
96*38e8c45fSAndroid Build Coastguard Worker
97*38e8c45fSAndroid Build Coastguard Worker class InputTracingTest : public testing::Test {
98*38e8c45fSAndroid Build Coastguard Worker protected:
99*38e8c45fSAndroid Build Coastguard Worker std::unique_ptr<FakeInputDispatcherPolicy> mFakePolicy;
100*38e8c45fSAndroid Build Coastguard Worker std::unique_ptr<InputDispatcher> mDispatcher;
101*38e8c45fSAndroid Build Coastguard Worker
SetUp()102*38e8c45fSAndroid Build Coastguard Worker void SetUp() override {
103*38e8c45fSAndroid Build Coastguard Worker impl::PerfettoBackend::sUseInProcessBackendForTest = true;
104*38e8c45fSAndroid Build Coastguard Worker impl::PerfettoBackend::sPackageManagerProvider = []() { return kPackageManager; };
105*38e8c45fSAndroid Build Coastguard Worker mFakePolicy = std::make_unique<FakeInputDispatcherPolicy>();
106*38e8c45fSAndroid Build Coastguard Worker
107*38e8c45fSAndroid Build Coastguard Worker auto tracingBackend = std::make_unique<impl::ThreadedBackend<impl::PerfettoBackend>>(
108*38e8c45fSAndroid Build Coastguard Worker impl::PerfettoBackend());
109*38e8c45fSAndroid Build Coastguard Worker mRequestTracerIdle = tracingBackend->getIdleWaiterForTesting();
110*38e8c45fSAndroid Build Coastguard Worker mDispatcher = std::make_unique<InputDispatcher>(*mFakePolicy, std::move(tracingBackend));
111*38e8c45fSAndroid Build Coastguard Worker
112*38e8c45fSAndroid Build Coastguard Worker mDispatcher->setInputDispatchMode(/*enabled=*/true, /*frozen=*/false);
113*38e8c45fSAndroid Build Coastguard Worker ASSERT_EQ(OK, mDispatcher->start());
114*38e8c45fSAndroid Build Coastguard Worker }
115*38e8c45fSAndroid Build Coastguard Worker
TearDown()116*38e8c45fSAndroid Build Coastguard Worker void TearDown() override {
117*38e8c45fSAndroid Build Coastguard Worker ASSERT_EQ(OK, mDispatcher->stop());
118*38e8c45fSAndroid Build Coastguard Worker mDispatcher.reset();
119*38e8c45fSAndroid Build Coastguard Worker mFakePolicy.reset();
120*38e8c45fSAndroid Build Coastguard Worker }
121*38e8c45fSAndroid Build Coastguard Worker
waitForTracerIdle()122*38e8c45fSAndroid Build Coastguard Worker void waitForTracerIdle() {
123*38e8c45fSAndroid Build Coastguard Worker mDispatcher->waitForIdle();
124*38e8c45fSAndroid Build Coastguard Worker mRequestTracerIdle();
125*38e8c45fSAndroid Build Coastguard Worker }
126*38e8c45fSAndroid Build Coastguard Worker
setFocusedWindow(const sp<gui::WindowInfoHandle> & window)127*38e8c45fSAndroid Build Coastguard Worker void setFocusedWindow(const sp<gui::WindowInfoHandle>& window) {
128*38e8c45fSAndroid Build Coastguard Worker gui::FocusRequest request;
129*38e8c45fSAndroid Build Coastguard Worker request.token = window->getToken();
130*38e8c45fSAndroid Build Coastguard Worker request.windowName = window->getName();
131*38e8c45fSAndroid Build Coastguard Worker request.timestamp = systemTime(SYSTEM_TIME_MONOTONIC);
132*38e8c45fSAndroid Build Coastguard Worker request.displayId = window->getInfo()->displayId.val();
133*38e8c45fSAndroid Build Coastguard Worker mDispatcher->setFocusedWindow(request);
134*38e8c45fSAndroid Build Coastguard Worker }
135*38e8c45fSAndroid Build Coastguard Worker
tapAndExpect(const std::vector<sp<FakeWindowHandle>> & windows,Level inboundTraceLevel,Level dispatchTraceLevel,InputTraceSession & s)136*38e8c45fSAndroid Build Coastguard Worker void tapAndExpect(const std::vector<sp<FakeWindowHandle>>& windows, Level inboundTraceLevel,
137*38e8c45fSAndroid Build Coastguard Worker Level dispatchTraceLevel, InputTraceSession& s) {
138*38e8c45fSAndroid Build Coastguard Worker const auto down = MotionArgsBuilder(ACTION_DOWN, AINPUT_SOURCE_TOUCHSCREEN)
139*38e8c45fSAndroid Build Coastguard Worker .pointer(PointerBuilder(0, ToolType::FINGER).x(100).y(110))
140*38e8c45fSAndroid Build Coastguard Worker .build();
141*38e8c45fSAndroid Build Coastguard Worker mDispatcher->notifyMotion(down);
142*38e8c45fSAndroid Build Coastguard Worker s.expectMotionTraced(inboundTraceLevel, toMotionEvent(down));
143*38e8c45fSAndroid Build Coastguard Worker for (const auto& window : windows) {
144*38e8c45fSAndroid Build Coastguard Worker auto consumed = window->consumeMotionEvent(WithMotionAction(ACTION_DOWN));
145*38e8c45fSAndroid Build Coastguard Worker s.expectDispatchTraced(dispatchTraceLevel, {*consumed, window});
146*38e8c45fSAndroid Build Coastguard Worker }
147*38e8c45fSAndroid Build Coastguard Worker
148*38e8c45fSAndroid Build Coastguard Worker const auto up = MotionArgsBuilder(ACTION_UP, AINPUT_SOURCE_TOUCHSCREEN)
149*38e8c45fSAndroid Build Coastguard Worker .pointer(PointerBuilder(0, ToolType::FINGER).x(100).y(110))
150*38e8c45fSAndroid Build Coastguard Worker .build();
151*38e8c45fSAndroid Build Coastguard Worker mDispatcher->notifyMotion(up);
152*38e8c45fSAndroid Build Coastguard Worker s.expectMotionTraced(inboundTraceLevel, toMotionEvent(up));
153*38e8c45fSAndroid Build Coastguard Worker for (const auto& window : windows) {
154*38e8c45fSAndroid Build Coastguard Worker auto consumed = window->consumeMotionEvent(WithMotionAction(ACTION_UP));
155*38e8c45fSAndroid Build Coastguard Worker s.expectDispatchTraced(dispatchTraceLevel, {*consumed, window});
156*38e8c45fSAndroid Build Coastguard Worker }
157*38e8c45fSAndroid Build Coastguard Worker }
158*38e8c45fSAndroid Build Coastguard Worker
keypressAndExpect(const std::vector<sp<FakeWindowHandle>> & windows,Level inboundTraceLevel,Level dispatchTraceLevel,InputTraceSession & s)159*38e8c45fSAndroid Build Coastguard Worker void keypressAndExpect(const std::vector<sp<FakeWindowHandle>>& windows,
160*38e8c45fSAndroid Build Coastguard Worker Level inboundTraceLevel, Level dispatchTraceLevel,
161*38e8c45fSAndroid Build Coastguard Worker InputTraceSession& s) {
162*38e8c45fSAndroid Build Coastguard Worker const auto down = KeyArgsBuilder(ACTION_DOWN, AINPUT_SOURCE_KEYBOARD).build();
163*38e8c45fSAndroid Build Coastguard Worker mDispatcher->notifyKey(down);
164*38e8c45fSAndroid Build Coastguard Worker s.expectKeyTraced(inboundTraceLevel, toKeyEvent(down));
165*38e8c45fSAndroid Build Coastguard Worker for (const auto& window : windows) {
166*38e8c45fSAndroid Build Coastguard Worker auto consumed = window->consumeKeyEvent(WithKeyAction(ACTION_DOWN));
167*38e8c45fSAndroid Build Coastguard Worker s.expectDispatchTraced(dispatchTraceLevel, {*consumed, window});
168*38e8c45fSAndroid Build Coastguard Worker }
169*38e8c45fSAndroid Build Coastguard Worker
170*38e8c45fSAndroid Build Coastguard Worker const auto up = KeyArgsBuilder(ACTION_UP, AINPUT_SOURCE_KEYBOARD).build();
171*38e8c45fSAndroid Build Coastguard Worker mDispatcher->notifyKey(up);
172*38e8c45fSAndroid Build Coastguard Worker s.expectKeyTraced(inboundTraceLevel, toKeyEvent(up));
173*38e8c45fSAndroid Build Coastguard Worker for (const auto& window : windows) {
174*38e8c45fSAndroid Build Coastguard Worker auto consumed = window->consumeKeyEvent(WithKeyAction(ACTION_UP));
175*38e8c45fSAndroid Build Coastguard Worker s.expectDispatchTraced(dispatchTraceLevel, {*consumed, window});
176*38e8c45fSAndroid Build Coastguard Worker }
177*38e8c45fSAndroid Build Coastguard Worker }
178*38e8c45fSAndroid Build Coastguard Worker
179*38e8c45fSAndroid Build Coastguard Worker private:
180*38e8c45fSAndroid Build Coastguard Worker std::function<void()> mRequestTracerIdle;
181*38e8c45fSAndroid Build Coastguard Worker };
182*38e8c45fSAndroid Build Coastguard Worker
TEST_F(InputTracingTest,EmptyConfigTracesNothing)183*38e8c45fSAndroid Build Coastguard Worker TEST_F(InputTracingTest, EmptyConfigTracesNothing) {
184*38e8c45fSAndroid Build Coastguard Worker InputTraceSession s{[](auto& config) {}};
185*38e8c45fSAndroid Build Coastguard Worker
186*38e8c45fSAndroid Build Coastguard Worker auto window = sp<FakeWindowHandle>::make(APP, mDispatcher, "Window", DISPLAY_ID);
187*38e8c45fSAndroid Build Coastguard Worker mDispatcher->onWindowInfosChanged({{*window->getInfo()}, {}, 0, 0});
188*38e8c45fSAndroid Build Coastguard Worker setFocusedWindow(window);
189*38e8c45fSAndroid Build Coastguard Worker window->consumeFocusEvent(true);
190*38e8c45fSAndroid Build Coastguard Worker
191*38e8c45fSAndroid Build Coastguard Worker tapAndExpect({window}, Level::NONE, Level::NONE, s);
192*38e8c45fSAndroid Build Coastguard Worker keypressAndExpect({window}, Level::NONE, Level::NONE, s);
193*38e8c45fSAndroid Build Coastguard Worker
194*38e8c45fSAndroid Build Coastguard Worker waitForTracerIdle();
195*38e8c45fSAndroid Build Coastguard Worker }
196*38e8c45fSAndroid Build Coastguard Worker
TEST_F(InputTracingTest,TraceAll)197*38e8c45fSAndroid Build Coastguard Worker TEST_F(InputTracingTest, TraceAll) {
198*38e8c45fSAndroid Build Coastguard Worker InputTraceSession s{
199*38e8c45fSAndroid Build Coastguard Worker [](auto& config) { config->set_mode(AndroidInputEventConfig::TRACE_MODE_TRACE_ALL); }};
200*38e8c45fSAndroid Build Coastguard Worker
201*38e8c45fSAndroid Build Coastguard Worker auto window = sp<FakeWindowHandle>::make(APP, mDispatcher, "Window", DISPLAY_ID);
202*38e8c45fSAndroid Build Coastguard Worker mDispatcher->onWindowInfosChanged({{*window->getInfo()}, {}, 0, 0});
203*38e8c45fSAndroid Build Coastguard Worker setFocusedWindow(window);
204*38e8c45fSAndroid Build Coastguard Worker window->consumeFocusEvent(true);
205*38e8c45fSAndroid Build Coastguard Worker
206*38e8c45fSAndroid Build Coastguard Worker tapAndExpect({window}, Level::COMPLETE, Level::COMPLETE, s);
207*38e8c45fSAndroid Build Coastguard Worker keypressAndExpect({window}, Level::COMPLETE, Level::COMPLETE, s);
208*38e8c45fSAndroid Build Coastguard Worker
209*38e8c45fSAndroid Build Coastguard Worker waitForTracerIdle();
210*38e8c45fSAndroid Build Coastguard Worker }
211*38e8c45fSAndroid Build Coastguard Worker
TEST_F(InputTracingTest,NoRulesTracesNothing)212*38e8c45fSAndroid Build Coastguard Worker TEST_F(InputTracingTest, NoRulesTracesNothing) {
213*38e8c45fSAndroid Build Coastguard Worker InputTraceSession s{[](auto& config) {
214*38e8c45fSAndroid Build Coastguard Worker config->set_trace_dispatcher_input_events(true);
215*38e8c45fSAndroid Build Coastguard Worker config->set_trace_dispatcher_window_dispatch(true);
216*38e8c45fSAndroid Build Coastguard Worker config->set_mode(AndroidInputEventConfig::TRACE_MODE_USE_RULES);
217*38e8c45fSAndroid Build Coastguard Worker }};
218*38e8c45fSAndroid Build Coastguard Worker
219*38e8c45fSAndroid Build Coastguard Worker auto window = sp<FakeWindowHandle>::make(APP, mDispatcher, "Window", DISPLAY_ID);
220*38e8c45fSAndroid Build Coastguard Worker mDispatcher->onWindowInfosChanged({{*window->getInfo()}, {}, 0, 0});
221*38e8c45fSAndroid Build Coastguard Worker setFocusedWindow(window);
222*38e8c45fSAndroid Build Coastguard Worker window->consumeFocusEvent(true);
223*38e8c45fSAndroid Build Coastguard Worker
224*38e8c45fSAndroid Build Coastguard Worker tapAndExpect({window}, Level::NONE, Level::NONE, s);
225*38e8c45fSAndroid Build Coastguard Worker keypressAndExpect({window}, Level::NONE, Level::NONE, s);
226*38e8c45fSAndroid Build Coastguard Worker
227*38e8c45fSAndroid Build Coastguard Worker waitForTracerIdle();
228*38e8c45fSAndroid Build Coastguard Worker }
229*38e8c45fSAndroid Build Coastguard Worker
TEST_F(InputTracingTest,EmptyRuleMatchesEverything)230*38e8c45fSAndroid Build Coastguard Worker TEST_F(InputTracingTest, EmptyRuleMatchesEverything) {
231*38e8c45fSAndroid Build Coastguard Worker InputTraceSession s{[](auto& config) {
232*38e8c45fSAndroid Build Coastguard Worker config->set_trace_dispatcher_input_events(true);
233*38e8c45fSAndroid Build Coastguard Worker config->set_trace_dispatcher_window_dispatch(true);
234*38e8c45fSAndroid Build Coastguard Worker config->set_mode(AndroidInputEventConfig::TRACE_MODE_USE_RULES);
235*38e8c45fSAndroid Build Coastguard Worker // Rule: Match everything as COMPLETE
236*38e8c45fSAndroid Build Coastguard Worker auto rule = config->add_rules();
237*38e8c45fSAndroid Build Coastguard Worker rule->set_trace_level(AndroidInputEventConfig::TRACE_LEVEL_COMPLETE);
238*38e8c45fSAndroid Build Coastguard Worker }};
239*38e8c45fSAndroid Build Coastguard Worker
240*38e8c45fSAndroid Build Coastguard Worker auto window = sp<FakeWindowHandle>::make(APP, mDispatcher, "Window", DISPLAY_ID);
241*38e8c45fSAndroid Build Coastguard Worker mDispatcher->onWindowInfosChanged({{*window->getInfo()}, {}, 0, 0});
242*38e8c45fSAndroid Build Coastguard Worker setFocusedWindow(window);
243*38e8c45fSAndroid Build Coastguard Worker window->consumeFocusEvent(true);
244*38e8c45fSAndroid Build Coastguard Worker
245*38e8c45fSAndroid Build Coastguard Worker tapAndExpect({window}, Level::COMPLETE, Level::COMPLETE, s);
246*38e8c45fSAndroid Build Coastguard Worker keypressAndExpect({window}, Level::COMPLETE, Level::COMPLETE, s);
247*38e8c45fSAndroid Build Coastguard Worker
248*38e8c45fSAndroid Build Coastguard Worker waitForTracerIdle();
249*38e8c45fSAndroid Build Coastguard Worker }
250*38e8c45fSAndroid Build Coastguard Worker
TEST_F(InputTracingTest,UnspecifiedTracelLevel)251*38e8c45fSAndroid Build Coastguard Worker TEST_F(InputTracingTest, UnspecifiedTracelLevel) {
252*38e8c45fSAndroid Build Coastguard Worker InputTraceSession s{[](auto& config) {
253*38e8c45fSAndroid Build Coastguard Worker config->set_trace_dispatcher_input_events(true);
254*38e8c45fSAndroid Build Coastguard Worker config->set_trace_dispatcher_window_dispatch(true);
255*38e8c45fSAndroid Build Coastguard Worker config->set_mode(AndroidInputEventConfig::TRACE_MODE_USE_RULES);
256*38e8c45fSAndroid Build Coastguard Worker // Rule: Match everything, trace level unspecified
257*38e8c45fSAndroid Build Coastguard Worker auto rule = config->add_rules();
258*38e8c45fSAndroid Build Coastguard Worker }};
259*38e8c45fSAndroid Build Coastguard Worker
260*38e8c45fSAndroid Build Coastguard Worker auto window = sp<FakeWindowHandle>::make(APP, mDispatcher, "Window", DISPLAY_ID);
261*38e8c45fSAndroid Build Coastguard Worker mDispatcher->onWindowInfosChanged({{*window->getInfo()}, {}, 0, 0});
262*38e8c45fSAndroid Build Coastguard Worker setFocusedWindow(window);
263*38e8c45fSAndroid Build Coastguard Worker window->consumeFocusEvent(true);
264*38e8c45fSAndroid Build Coastguard Worker
265*38e8c45fSAndroid Build Coastguard Worker // Event is not traced by default if trace level is unspecified
266*38e8c45fSAndroid Build Coastguard Worker tapAndExpect({window}, Level::NONE, Level::NONE, s);
267*38e8c45fSAndroid Build Coastguard Worker keypressAndExpect({window}, Level::NONE, Level::NONE, s);
268*38e8c45fSAndroid Build Coastguard Worker
269*38e8c45fSAndroid Build Coastguard Worker waitForTracerIdle();
270*38e8c45fSAndroid Build Coastguard Worker }
271*38e8c45fSAndroid Build Coastguard Worker
TEST_F(InputTracingTest,MatchSecureWindow)272*38e8c45fSAndroid Build Coastguard Worker TEST_F(InputTracingTest, MatchSecureWindow) {
273*38e8c45fSAndroid Build Coastguard Worker InputTraceSession s{[](auto& config) {
274*38e8c45fSAndroid Build Coastguard Worker config->set_trace_dispatcher_input_events(true);
275*38e8c45fSAndroid Build Coastguard Worker config->set_trace_dispatcher_window_dispatch(true);
276*38e8c45fSAndroid Build Coastguard Worker config->set_mode(AndroidInputEventConfig::TRACE_MODE_USE_RULES);
277*38e8c45fSAndroid Build Coastguard Worker // Rule: Match secure windows as COMPLETE
278*38e8c45fSAndroid Build Coastguard Worker auto rule = config->add_rules();
279*38e8c45fSAndroid Build Coastguard Worker rule->set_trace_level(AndroidInputEventConfig::TRACE_LEVEL_COMPLETE);
280*38e8c45fSAndroid Build Coastguard Worker rule->set_match_secure(true);
281*38e8c45fSAndroid Build Coastguard Worker }};
282*38e8c45fSAndroid Build Coastguard Worker
283*38e8c45fSAndroid Build Coastguard Worker // Add a normal window and a spy window.
284*38e8c45fSAndroid Build Coastguard Worker auto window = sp<FakeWindowHandle>::make(APP, mDispatcher, "Window", DISPLAY_ID);
285*38e8c45fSAndroid Build Coastguard Worker auto spy = sp<FakeWindowHandle>::make(APP, mDispatcher, "Spy", DISPLAY_ID);
286*38e8c45fSAndroid Build Coastguard Worker spy->setSpy(true);
287*38e8c45fSAndroid Build Coastguard Worker spy->setTrustedOverlay(true);
288*38e8c45fSAndroid Build Coastguard Worker mDispatcher->onWindowInfosChanged({{*spy->getInfo(), *window->getInfo()}, {}, 0, 0});
289*38e8c45fSAndroid Build Coastguard Worker
290*38e8c45fSAndroid Build Coastguard Worker // Since neither are secure windows, events should not be traced.
291*38e8c45fSAndroid Build Coastguard Worker tapAndExpect({spy, window}, Level::NONE, Level::NONE, s);
292*38e8c45fSAndroid Build Coastguard Worker
293*38e8c45fSAndroid Build Coastguard Worker // Events should be matched as secure if any of the target windows is marked as secure.
294*38e8c45fSAndroid Build Coastguard Worker spy->setSecure(true);
295*38e8c45fSAndroid Build Coastguard Worker mDispatcher->onWindowInfosChanged({{*spy->getInfo(), *window->getInfo()}, {}, 0, 0});
296*38e8c45fSAndroid Build Coastguard Worker tapAndExpect({spy, window}, Level::COMPLETE, Level::COMPLETE, s);
297*38e8c45fSAndroid Build Coastguard Worker
298*38e8c45fSAndroid Build Coastguard Worker spy->setSecure(false);
299*38e8c45fSAndroid Build Coastguard Worker window->setSecure(true);
300*38e8c45fSAndroid Build Coastguard Worker mDispatcher->onWindowInfosChanged({{*spy->getInfo(), *window->getInfo()}, {}, 0, 0});
301*38e8c45fSAndroid Build Coastguard Worker tapAndExpect({spy, window}, Level::COMPLETE, Level::COMPLETE, s);
302*38e8c45fSAndroid Build Coastguard Worker
303*38e8c45fSAndroid Build Coastguard Worker spy->setSecure(true);
304*38e8c45fSAndroid Build Coastguard Worker window->setSecure(true);
305*38e8c45fSAndroid Build Coastguard Worker mDispatcher->onWindowInfosChanged({{*spy->getInfo(), *window->getInfo()}, {}, 0, 0});
306*38e8c45fSAndroid Build Coastguard Worker tapAndExpect({spy, window}, Level::COMPLETE, Level::COMPLETE, s);
307*38e8c45fSAndroid Build Coastguard Worker
308*38e8c45fSAndroid Build Coastguard Worker spy->setSecure(false);
309*38e8c45fSAndroid Build Coastguard Worker window->setSecure(false);
310*38e8c45fSAndroid Build Coastguard Worker mDispatcher->onWindowInfosChanged({{*spy->getInfo(), *window->getInfo()}, {}, 0, 0});
311*38e8c45fSAndroid Build Coastguard Worker tapAndExpect({spy, window}, Level::NONE, Level::NONE, s);
312*38e8c45fSAndroid Build Coastguard Worker
313*38e8c45fSAndroid Build Coastguard Worker waitForTracerIdle();
314*38e8c45fSAndroid Build Coastguard Worker }
315*38e8c45fSAndroid Build Coastguard Worker
TEST_F(InputTracingTest,MatchImeConnectionActive)316*38e8c45fSAndroid Build Coastguard Worker TEST_F(InputTracingTest, MatchImeConnectionActive) {
317*38e8c45fSAndroid Build Coastguard Worker InputTraceSession s{[](auto& config) {
318*38e8c45fSAndroid Build Coastguard Worker config->set_trace_dispatcher_input_events(true);
319*38e8c45fSAndroid Build Coastguard Worker config->set_trace_dispatcher_window_dispatch(true);
320*38e8c45fSAndroid Build Coastguard Worker config->set_mode(AndroidInputEventConfig::TRACE_MODE_USE_RULES);
321*38e8c45fSAndroid Build Coastguard Worker // Rule: Match IME Connection Active as COMPLETE
322*38e8c45fSAndroid Build Coastguard Worker auto rule = config->add_rules();
323*38e8c45fSAndroid Build Coastguard Worker rule->set_trace_level(AndroidInputEventConfig::TRACE_LEVEL_COMPLETE);
324*38e8c45fSAndroid Build Coastguard Worker rule->set_match_ime_connection_active(true);
325*38e8c45fSAndroid Build Coastguard Worker }};
326*38e8c45fSAndroid Build Coastguard Worker
327*38e8c45fSAndroid Build Coastguard Worker // Add a normal window and a spy window.
328*38e8c45fSAndroid Build Coastguard Worker auto window = sp<FakeWindowHandle>::make(APP, mDispatcher, "Window", DISPLAY_ID);
329*38e8c45fSAndroid Build Coastguard Worker auto spy = sp<FakeWindowHandle>::make(APP, mDispatcher, "Spy", DISPLAY_ID);
330*38e8c45fSAndroid Build Coastguard Worker spy->setSpy(true);
331*38e8c45fSAndroid Build Coastguard Worker spy->setTrustedOverlay(true);
332*38e8c45fSAndroid Build Coastguard Worker mDispatcher->onWindowInfosChanged({{*spy->getInfo(), *window->getInfo()}, {}, 0, 0});
333*38e8c45fSAndroid Build Coastguard Worker
334*38e8c45fSAndroid Build Coastguard Worker // Since IME connection is not active, events should not be traced.
335*38e8c45fSAndroid Build Coastguard Worker tapAndExpect({spy, window}, Level::NONE, Level::NONE, s);
336*38e8c45fSAndroid Build Coastguard Worker
337*38e8c45fSAndroid Build Coastguard Worker mDispatcher->setInputMethodConnectionIsActive(true);
338*38e8c45fSAndroid Build Coastguard Worker tapAndExpect({spy, window}, Level::COMPLETE, Level::COMPLETE, s);
339*38e8c45fSAndroid Build Coastguard Worker
340*38e8c45fSAndroid Build Coastguard Worker mDispatcher->setInputMethodConnectionIsActive(false);
341*38e8c45fSAndroid Build Coastguard Worker tapAndExpect({spy, window}, Level::NONE, Level::NONE, s);
342*38e8c45fSAndroid Build Coastguard Worker
343*38e8c45fSAndroid Build Coastguard Worker waitForTracerIdle();
344*38e8c45fSAndroid Build Coastguard Worker }
345*38e8c45fSAndroid Build Coastguard Worker
TEST_F(InputTracingTest,MatchAllPackages)346*38e8c45fSAndroid Build Coastguard Worker TEST_F(InputTracingTest, MatchAllPackages) {
347*38e8c45fSAndroid Build Coastguard Worker InputTraceSession s{[](auto& config) {
348*38e8c45fSAndroid Build Coastguard Worker config->set_trace_dispatcher_input_events(true);
349*38e8c45fSAndroid Build Coastguard Worker config->set_trace_dispatcher_window_dispatch(true);
350*38e8c45fSAndroid Build Coastguard Worker config->set_mode(AndroidInputEventConfig::TRACE_MODE_USE_RULES);
351*38e8c45fSAndroid Build Coastguard Worker // Rule: Match all package as COMPLETE
352*38e8c45fSAndroid Build Coastguard Worker auto rule = config->add_rules();
353*38e8c45fSAndroid Build Coastguard Worker rule->set_trace_level(AndroidInputEventConfig::TRACE_LEVEL_COMPLETE);
354*38e8c45fSAndroid Build Coastguard Worker rule->add_match_all_packages(ALLOWED_PKG_1);
355*38e8c45fSAndroid Build Coastguard Worker rule->add_match_all_packages(ALLOWED_PKG_2);
356*38e8c45fSAndroid Build Coastguard Worker }};
357*38e8c45fSAndroid Build Coastguard Worker
358*38e8c45fSAndroid Build Coastguard Worker // All windows are allowlisted.
359*38e8c45fSAndroid Build Coastguard Worker auto window = sp<FakeWindowHandle>::make(APP, mDispatcher, "Window", DISPLAY_ID);
360*38e8c45fSAndroid Build Coastguard Worker window->setOwnerInfo(PID, ALLOWED_UID_1);
361*38e8c45fSAndroid Build Coastguard Worker auto spy = sp<FakeWindowHandle>::make(APP, mDispatcher, "Spy", DISPLAY_ID);
362*38e8c45fSAndroid Build Coastguard Worker spy->setOwnerInfo(PID, ALLOWED_UID_2);
363*38e8c45fSAndroid Build Coastguard Worker spy->setSpy(true);
364*38e8c45fSAndroid Build Coastguard Worker spy->setTrustedOverlay(true);
365*38e8c45fSAndroid Build Coastguard Worker auto systemSpy = sp<FakeWindowHandle>::make(APP, mDispatcher, "Spy", DISPLAY_ID);
366*38e8c45fSAndroid Build Coastguard Worker systemSpy->setOwnerInfo(PID, gui::Uid{AID_SYSTEM});
367*38e8c45fSAndroid Build Coastguard Worker systemSpy->setSpy(true);
368*38e8c45fSAndroid Build Coastguard Worker systemSpy->setTrustedOverlay(true);
369*38e8c45fSAndroid Build Coastguard Worker mDispatcher->onWindowInfosChanged(
370*38e8c45fSAndroid Build Coastguard Worker {{*systemSpy->getInfo(), *spy->getInfo(), *window->getInfo()}, {}, 0, 0});
371*38e8c45fSAndroid Build Coastguard Worker
372*38e8c45fSAndroid Build Coastguard Worker tapAndExpect({systemSpy, spy, window}, Level::COMPLETE, Level::COMPLETE, s);
373*38e8c45fSAndroid Build Coastguard Worker
374*38e8c45fSAndroid Build Coastguard Worker // Add a disallowed spy. This will result in the event not being traced for all windows.
375*38e8c45fSAndroid Build Coastguard Worker auto disallowedSpy = sp<FakeWindowHandle>::make(APP, mDispatcher, "Spy", DISPLAY_ID);
376*38e8c45fSAndroid Build Coastguard Worker disallowedSpy->setOwnerInfo(PID, DISALLOWED_UID_1);
377*38e8c45fSAndroid Build Coastguard Worker disallowedSpy->setSpy(true);
378*38e8c45fSAndroid Build Coastguard Worker disallowedSpy->setTrustedOverlay(true);
379*38e8c45fSAndroid Build Coastguard Worker mDispatcher->onWindowInfosChanged({{*systemSpy->getInfo(), *spy->getInfo(),
380*38e8c45fSAndroid Build Coastguard Worker *disallowedSpy->getInfo(), *window->getInfo()},
381*38e8c45fSAndroid Build Coastguard Worker {},
382*38e8c45fSAndroid Build Coastguard Worker 0,
383*38e8c45fSAndroid Build Coastguard Worker 0});
384*38e8c45fSAndroid Build Coastguard Worker
385*38e8c45fSAndroid Build Coastguard Worker tapAndExpect({systemSpy, spy, disallowedSpy, window}, Level::NONE, Level::NONE, s);
386*38e8c45fSAndroid Build Coastguard Worker
387*38e8c45fSAndroid Build Coastguard Worker // Change the owner of the disallowed spy to one for which we don't have a package mapping.
388*38e8c45fSAndroid Build Coastguard Worker disallowedSpy->setOwnerInfo(PID, UNLISTED_UID);
389*38e8c45fSAndroid Build Coastguard Worker mDispatcher->onWindowInfosChanged({{*systemSpy->getInfo(), *spy->getInfo(),
390*38e8c45fSAndroid Build Coastguard Worker *disallowedSpy->getInfo(), *window->getInfo()},
391*38e8c45fSAndroid Build Coastguard Worker {},
392*38e8c45fSAndroid Build Coastguard Worker 0,
393*38e8c45fSAndroid Build Coastguard Worker 0});
394*38e8c45fSAndroid Build Coastguard Worker
395*38e8c45fSAndroid Build Coastguard Worker tapAndExpect({systemSpy, spy, disallowedSpy, window}, Level::NONE, Level::NONE, s);
396*38e8c45fSAndroid Build Coastguard Worker
397*38e8c45fSAndroid Build Coastguard Worker // Remove the disallowed spy. Events are traced again.
398*38e8c45fSAndroid Build Coastguard Worker mDispatcher->onWindowInfosChanged(
399*38e8c45fSAndroid Build Coastguard Worker {{*systemSpy->getInfo(), *spy->getInfo(), *window->getInfo()}, {}, 0, 0});
400*38e8c45fSAndroid Build Coastguard Worker
401*38e8c45fSAndroid Build Coastguard Worker tapAndExpect({systemSpy, spy, window}, Level::COMPLETE, Level::COMPLETE, s);
402*38e8c45fSAndroid Build Coastguard Worker
403*38e8c45fSAndroid Build Coastguard Worker waitForTracerIdle();
404*38e8c45fSAndroid Build Coastguard Worker }
405*38e8c45fSAndroid Build Coastguard Worker
TEST_F(InputTracingTest,MatchAnyPackages)406*38e8c45fSAndroid Build Coastguard Worker TEST_F(InputTracingTest, MatchAnyPackages) {
407*38e8c45fSAndroid Build Coastguard Worker InputTraceSession s{[](auto& config) {
408*38e8c45fSAndroid Build Coastguard Worker config->set_trace_dispatcher_input_events(true);
409*38e8c45fSAndroid Build Coastguard Worker config->set_trace_dispatcher_window_dispatch(true);
410*38e8c45fSAndroid Build Coastguard Worker config->set_mode(AndroidInputEventConfig::TRACE_MODE_USE_RULES);
411*38e8c45fSAndroid Build Coastguard Worker // Rule: Match any package as COMPLETE
412*38e8c45fSAndroid Build Coastguard Worker auto rule = config->add_rules();
413*38e8c45fSAndroid Build Coastguard Worker rule->set_trace_level(AndroidInputEventConfig::TRACE_LEVEL_COMPLETE);
414*38e8c45fSAndroid Build Coastguard Worker rule->add_match_any_packages(ALLOWED_PKG_1);
415*38e8c45fSAndroid Build Coastguard Worker rule->add_match_any_packages(ALLOWED_PKG_2);
416*38e8c45fSAndroid Build Coastguard Worker }};
417*38e8c45fSAndroid Build Coastguard Worker
418*38e8c45fSAndroid Build Coastguard Worker // Just a disallowed window. Events are not traced.
419*38e8c45fSAndroid Build Coastguard Worker auto window = sp<FakeWindowHandle>::make(APP, mDispatcher, "Window", DISPLAY_ID);
420*38e8c45fSAndroid Build Coastguard Worker window->setOwnerInfo(PID, DISALLOWED_UID_1);
421*38e8c45fSAndroid Build Coastguard Worker mDispatcher->onWindowInfosChanged({{*window->getInfo()}, {}, 0, 0});
422*38e8c45fSAndroid Build Coastguard Worker
423*38e8c45fSAndroid Build Coastguard Worker tapAndExpect({window}, Level::NONE, Level::NONE, s);
424*38e8c45fSAndroid Build Coastguard Worker
425*38e8c45fSAndroid Build Coastguard Worker // Add a spy for which we don't have a package mapping. Events are still not traced.
426*38e8c45fSAndroid Build Coastguard Worker auto disallowedSpy = sp<FakeWindowHandle>::make(APP, mDispatcher, "Spy", DISPLAY_ID);
427*38e8c45fSAndroid Build Coastguard Worker disallowedSpy->setOwnerInfo(PID, UNLISTED_UID);
428*38e8c45fSAndroid Build Coastguard Worker disallowedSpy->setSpy(true);
429*38e8c45fSAndroid Build Coastguard Worker disallowedSpy->setTrustedOverlay(true);
430*38e8c45fSAndroid Build Coastguard Worker mDispatcher->onWindowInfosChanged({{*disallowedSpy->getInfo(), *window->getInfo()}, {}, 0, 0});
431*38e8c45fSAndroid Build Coastguard Worker
432*38e8c45fSAndroid Build Coastguard Worker tapAndExpect({disallowedSpy, window}, Level::NONE, Level::NONE, s);
433*38e8c45fSAndroid Build Coastguard Worker
434*38e8c45fSAndroid Build Coastguard Worker // Add an allowed spy. Events are now traced for all packages.
435*38e8c45fSAndroid Build Coastguard Worker auto spy = sp<FakeWindowHandle>::make(APP, mDispatcher, "Spy", DISPLAY_ID);
436*38e8c45fSAndroid Build Coastguard Worker spy->setOwnerInfo(PID, ALLOWED_UID_1);
437*38e8c45fSAndroid Build Coastguard Worker spy->setSpy(true);
438*38e8c45fSAndroid Build Coastguard Worker spy->setTrustedOverlay(true);
439*38e8c45fSAndroid Build Coastguard Worker mDispatcher->onWindowInfosChanged(
440*38e8c45fSAndroid Build Coastguard Worker {{*disallowedSpy->getInfo(), *spy->getInfo(), *window->getInfo()}, {}, 0, 0});
441*38e8c45fSAndroid Build Coastguard Worker
442*38e8c45fSAndroid Build Coastguard Worker tapAndExpect({disallowedSpy, spy, window}, Level::COMPLETE, Level::COMPLETE, s);
443*38e8c45fSAndroid Build Coastguard Worker
444*38e8c45fSAndroid Build Coastguard Worker // Add another disallowed spy. Events are still traced.
445*38e8c45fSAndroid Build Coastguard Worker auto disallowedSpy2 = sp<FakeWindowHandle>::make(APP, mDispatcher, "Spy", DISPLAY_ID);
446*38e8c45fSAndroid Build Coastguard Worker disallowedSpy2->setOwnerInfo(PID, DISALLOWED_UID_2);
447*38e8c45fSAndroid Build Coastguard Worker disallowedSpy2->setSpy(true);
448*38e8c45fSAndroid Build Coastguard Worker disallowedSpy2->setTrustedOverlay(true);
449*38e8c45fSAndroid Build Coastguard Worker mDispatcher->onWindowInfosChanged({{*disallowedSpy->getInfo(), *disallowedSpy2->getInfo(),
450*38e8c45fSAndroid Build Coastguard Worker *spy->getInfo(), *window->getInfo()},
451*38e8c45fSAndroid Build Coastguard Worker {},
452*38e8c45fSAndroid Build Coastguard Worker 0,
453*38e8c45fSAndroid Build Coastguard Worker 0});
454*38e8c45fSAndroid Build Coastguard Worker
455*38e8c45fSAndroid Build Coastguard Worker tapAndExpect({disallowedSpy, disallowedSpy2, spy, window}, Level::COMPLETE, Level::COMPLETE, s);
456*38e8c45fSAndroid Build Coastguard Worker
457*38e8c45fSAndroid Build Coastguard Worker waitForTracerIdle();
458*38e8c45fSAndroid Build Coastguard Worker }
459*38e8c45fSAndroid Build Coastguard Worker
TEST_F(InputTracingTest,MultipleMatchersInOneRule)460*38e8c45fSAndroid Build Coastguard Worker TEST_F(InputTracingTest, MultipleMatchersInOneRule) {
461*38e8c45fSAndroid Build Coastguard Worker InputTraceSession s{[](auto& config) {
462*38e8c45fSAndroid Build Coastguard Worker config->set_trace_dispatcher_input_events(true);
463*38e8c45fSAndroid Build Coastguard Worker config->set_trace_dispatcher_window_dispatch(true);
464*38e8c45fSAndroid Build Coastguard Worker config->set_mode(AndroidInputEventConfig::TRACE_MODE_USE_RULES);
465*38e8c45fSAndroid Build Coastguard Worker // Rule: Match all of the following conditions as COMPLETE
466*38e8c45fSAndroid Build Coastguard Worker auto rule = config->add_rules();
467*38e8c45fSAndroid Build Coastguard Worker rule->set_trace_level(AndroidInputEventConfig::TRACE_LEVEL_COMPLETE);
468*38e8c45fSAndroid Build Coastguard Worker rule->add_match_all_packages(ALLOWED_PKG_1);
469*38e8c45fSAndroid Build Coastguard Worker rule->add_match_all_packages(ALLOWED_PKG_2);
470*38e8c45fSAndroid Build Coastguard Worker rule->add_match_any_packages(ALLOWED_PKG_1);
471*38e8c45fSAndroid Build Coastguard Worker rule->add_match_any_packages(DISALLOWED_PKG_1);
472*38e8c45fSAndroid Build Coastguard Worker rule->set_match_secure(false);
473*38e8c45fSAndroid Build Coastguard Worker rule->set_match_ime_connection_active(false);
474*38e8c45fSAndroid Build Coastguard Worker }};
475*38e8c45fSAndroid Build Coastguard Worker
476*38e8c45fSAndroid Build Coastguard Worker // A single window into an allowed UID. Matches all matchers.
477*38e8c45fSAndroid Build Coastguard Worker auto window = sp<FakeWindowHandle>::make(APP, mDispatcher, "Window", DISPLAY_ID);
478*38e8c45fSAndroid Build Coastguard Worker window->setOwnerInfo(PID, ALLOWED_UID_1);
479*38e8c45fSAndroid Build Coastguard Worker mDispatcher->onWindowInfosChanged({{*window->getInfo()}, {}, 0, 0});
480*38e8c45fSAndroid Build Coastguard Worker
481*38e8c45fSAndroid Build Coastguard Worker tapAndExpect({window}, Level::COMPLETE, Level::COMPLETE, s);
482*38e8c45fSAndroid Build Coastguard Worker
483*38e8c45fSAndroid Build Coastguard Worker // Secure window does not match.
484*38e8c45fSAndroid Build Coastguard Worker window->setSecure(true);
485*38e8c45fSAndroid Build Coastguard Worker mDispatcher->onWindowInfosChanged({{*window->getInfo()}, {}, 0, 0});
486*38e8c45fSAndroid Build Coastguard Worker
487*38e8c45fSAndroid Build Coastguard Worker tapAndExpect({window}, Level::NONE, Level::NONE, s);
488*38e8c45fSAndroid Build Coastguard Worker
489*38e8c45fSAndroid Build Coastguard Worker // IME Connection Active does not match.
490*38e8c45fSAndroid Build Coastguard Worker window->setSecure(false);
491*38e8c45fSAndroid Build Coastguard Worker mDispatcher->onWindowInfosChanged({{*window->getInfo()}, {}, 0, 0});
492*38e8c45fSAndroid Build Coastguard Worker mDispatcher->setInputMethodConnectionIsActive(true);
493*38e8c45fSAndroid Build Coastguard Worker
494*38e8c45fSAndroid Build Coastguard Worker tapAndExpect({window}, Level::NONE, Level::NONE, s);
495*38e8c45fSAndroid Build Coastguard Worker
496*38e8c45fSAndroid Build Coastguard Worker // Event going to DISALLOWED_PKG_1 does not match because it's not listed in match_all_packages.
497*38e8c45fSAndroid Build Coastguard Worker mDispatcher->setInputMethodConnectionIsActive(false);
498*38e8c45fSAndroid Build Coastguard Worker auto disallowedSpy = sp<FakeWindowHandle>::make(APP, mDispatcher, "Spy", DISPLAY_ID);
499*38e8c45fSAndroid Build Coastguard Worker disallowedSpy->setOwnerInfo(PID, DISALLOWED_UID_1);
500*38e8c45fSAndroid Build Coastguard Worker disallowedSpy->setSpy(true);
501*38e8c45fSAndroid Build Coastguard Worker disallowedSpy->setTrustedOverlay(true);
502*38e8c45fSAndroid Build Coastguard Worker mDispatcher->onWindowInfosChanged({{*disallowedSpy->getInfo(), *window->getInfo()}, {}, 0, 0});
503*38e8c45fSAndroid Build Coastguard Worker
504*38e8c45fSAndroid Build Coastguard Worker tapAndExpect({disallowedSpy, window}, Level::NONE, Level::NONE, s);
505*38e8c45fSAndroid Build Coastguard Worker
506*38e8c45fSAndroid Build Coastguard Worker // Event going to ALLOWED_PKG_1 does not match because it's not listed in match_any_packages.
507*38e8c45fSAndroid Build Coastguard Worker window->setOwnerInfo(PID, ALLOWED_UID_2);
508*38e8c45fSAndroid Build Coastguard Worker mDispatcher->onWindowInfosChanged({{*window->getInfo()}, {}, 0, 0});
509*38e8c45fSAndroid Build Coastguard Worker
510*38e8c45fSAndroid Build Coastguard Worker tapAndExpect({window}, Level::NONE, Level::NONE, s);
511*38e8c45fSAndroid Build Coastguard Worker
512*38e8c45fSAndroid Build Coastguard Worker // All conditions match.
513*38e8c45fSAndroid Build Coastguard Worker auto spy = sp<FakeWindowHandle>::make(APP, mDispatcher, "Spy", DISPLAY_ID);
514*38e8c45fSAndroid Build Coastguard Worker spy->setOwnerInfo(PID, ALLOWED_UID_1);
515*38e8c45fSAndroid Build Coastguard Worker spy->setSpy(true);
516*38e8c45fSAndroid Build Coastguard Worker spy->setTrustedOverlay(true);
517*38e8c45fSAndroid Build Coastguard Worker mDispatcher->onWindowInfosChanged({{*spy->getInfo(), *window->getInfo()}, {}, 0, 0});
518*38e8c45fSAndroid Build Coastguard Worker
519*38e8c45fSAndroid Build Coastguard Worker tapAndExpect({spy, window}, Level::COMPLETE, Level::COMPLETE, s);
520*38e8c45fSAndroid Build Coastguard Worker
521*38e8c45fSAndroid Build Coastguard Worker waitForTracerIdle();
522*38e8c45fSAndroid Build Coastguard Worker }
523*38e8c45fSAndroid Build Coastguard Worker
TEST_F(InputTracingTest,MultipleRulesMatchInOrder)524*38e8c45fSAndroid Build Coastguard Worker TEST_F(InputTracingTest, MultipleRulesMatchInOrder) {
525*38e8c45fSAndroid Build Coastguard Worker InputTraceSession s{[](auto& config) {
526*38e8c45fSAndroid Build Coastguard Worker config->set_trace_dispatcher_input_events(true);
527*38e8c45fSAndroid Build Coastguard Worker config->set_trace_dispatcher_window_dispatch(true);
528*38e8c45fSAndroid Build Coastguard Worker config->set_mode(AndroidInputEventConfig::TRACE_MODE_USE_RULES);
529*38e8c45fSAndroid Build Coastguard Worker // Rule: Don't trace secure events
530*38e8c45fSAndroid Build Coastguard Worker auto rule1 = config->add_rules();
531*38e8c45fSAndroid Build Coastguard Worker rule1->set_trace_level(AndroidInputEventConfig::TRACE_LEVEL_NONE);
532*38e8c45fSAndroid Build Coastguard Worker rule1->set_match_secure(true);
533*38e8c45fSAndroid Build Coastguard Worker // Rule: Trace matched packages as COMPLETE when IME inactive
534*38e8c45fSAndroid Build Coastguard Worker auto rule2 = config->add_rules();
535*38e8c45fSAndroid Build Coastguard Worker rule2->set_trace_level(AndroidInputEventConfig::TRACE_LEVEL_COMPLETE);
536*38e8c45fSAndroid Build Coastguard Worker rule2->add_match_all_packages(ALLOWED_PKG_1);
537*38e8c45fSAndroid Build Coastguard Worker rule2->add_match_all_packages(ALLOWED_PKG_2);
538*38e8c45fSAndroid Build Coastguard Worker rule2->set_match_ime_connection_active(false);
539*38e8c45fSAndroid Build Coastguard Worker // Rule: Trace the rest of the events as REDACTED
540*38e8c45fSAndroid Build Coastguard Worker auto rule3 = config->add_rules();
541*38e8c45fSAndroid Build Coastguard Worker rule3->set_trace_level(AndroidInputEventConfig::TRACE_LEVEL_REDACTED);
542*38e8c45fSAndroid Build Coastguard Worker }};
543*38e8c45fSAndroid Build Coastguard Worker
544*38e8c45fSAndroid Build Coastguard Worker auto window = sp<FakeWindowHandle>::make(APP, mDispatcher, "Window", DISPLAY_ID);
545*38e8c45fSAndroid Build Coastguard Worker window->setOwnerInfo(PID, ALLOWED_UID_1);
546*38e8c45fSAndroid Build Coastguard Worker mDispatcher->onWindowInfosChanged({{*window->getInfo()}, {}, 0, 0});
547*38e8c45fSAndroid Build Coastguard Worker
548*38e8c45fSAndroid Build Coastguard Worker tapAndExpect({window}, Level::COMPLETE, Level::COMPLETE, s);
549*38e8c45fSAndroid Build Coastguard Worker
550*38e8c45fSAndroid Build Coastguard Worker // Verify that the first rule that matches in the order that they are specified is the
551*38e8c45fSAndroid Build Coastguard Worker // one that applies to the event.
552*38e8c45fSAndroid Build Coastguard Worker mDispatcher->setInputMethodConnectionIsActive(true);
553*38e8c45fSAndroid Build Coastguard Worker tapAndExpect({window}, Level::REDACTED, Level::REDACTED, s);
554*38e8c45fSAndroid Build Coastguard Worker
555*38e8c45fSAndroid Build Coastguard Worker mDispatcher->setInputMethodConnectionIsActive(false);
556*38e8c45fSAndroid Build Coastguard Worker auto spy = sp<FakeWindowHandle>::make(APP, mDispatcher, "Spy", DISPLAY_ID);
557*38e8c45fSAndroid Build Coastguard Worker spy->setOwnerInfo(PID, ALLOWED_UID_2);
558*38e8c45fSAndroid Build Coastguard Worker spy->setSpy(true);
559*38e8c45fSAndroid Build Coastguard Worker spy->setTrustedOverlay(true);
560*38e8c45fSAndroid Build Coastguard Worker spy->setSecure(true);
561*38e8c45fSAndroid Build Coastguard Worker mDispatcher->onWindowInfosChanged({{*spy->getInfo(), *window->getInfo()}, {}, 0, 0});
562*38e8c45fSAndroid Build Coastguard Worker
563*38e8c45fSAndroid Build Coastguard Worker tapAndExpect({spy, window}, Level::NONE, Level::NONE, s);
564*38e8c45fSAndroid Build Coastguard Worker
565*38e8c45fSAndroid Build Coastguard Worker spy->setSecure(false);
566*38e8c45fSAndroid Build Coastguard Worker mDispatcher->onWindowInfosChanged({{*spy->getInfo(), *window->getInfo()}, {}, 0, 0});
567*38e8c45fSAndroid Build Coastguard Worker
568*38e8c45fSAndroid Build Coastguard Worker tapAndExpect({spy, window}, Level::COMPLETE, Level::COMPLETE, s);
569*38e8c45fSAndroid Build Coastguard Worker
570*38e8c45fSAndroid Build Coastguard Worker spy->setOwnerInfo(PID, DISALLOWED_UID_1);
571*38e8c45fSAndroid Build Coastguard Worker mDispatcher->onWindowInfosChanged({{*spy->getInfo(), *window->getInfo()}, {}, 0, 0});
572*38e8c45fSAndroid Build Coastguard Worker
573*38e8c45fSAndroid Build Coastguard Worker tapAndExpect({spy, window}, Level::REDACTED, Level::REDACTED, s);
574*38e8c45fSAndroid Build Coastguard Worker
575*38e8c45fSAndroid Build Coastguard Worker waitForTracerIdle();
576*38e8c45fSAndroid Build Coastguard Worker }
577*38e8c45fSAndroid Build Coastguard Worker
TEST_F(InputTracingTest,TraceInboundEvents)578*38e8c45fSAndroid Build Coastguard Worker TEST_F(InputTracingTest, TraceInboundEvents) {
579*38e8c45fSAndroid Build Coastguard Worker InputTraceSession s{[](auto& config) {
580*38e8c45fSAndroid Build Coastguard Worker // Only trace inbounds events - don't trace window dispatch
581*38e8c45fSAndroid Build Coastguard Worker config->set_trace_dispatcher_input_events(true);
582*38e8c45fSAndroid Build Coastguard Worker config->set_mode(AndroidInputEventConfig::TRACE_MODE_USE_RULES);
583*38e8c45fSAndroid Build Coastguard Worker // Rule: Trace everything as REDACTED
584*38e8c45fSAndroid Build Coastguard Worker auto rule1 = config->add_rules();
585*38e8c45fSAndroid Build Coastguard Worker rule1->set_trace_level(AndroidInputEventConfig::TRACE_LEVEL_REDACTED);
586*38e8c45fSAndroid Build Coastguard Worker }};
587*38e8c45fSAndroid Build Coastguard Worker
588*38e8c45fSAndroid Build Coastguard Worker auto window = sp<FakeWindowHandle>::make(APP, mDispatcher, "Window", DISPLAY_ID);
589*38e8c45fSAndroid Build Coastguard Worker window->setOwnerInfo(PID, ALLOWED_UID_1);
590*38e8c45fSAndroid Build Coastguard Worker mDispatcher->onWindowInfosChanged({{*window->getInfo()}, {}, 0, 0});
591*38e8c45fSAndroid Build Coastguard Worker
592*38e8c45fSAndroid Build Coastguard Worker // Only the inbound events are traced. No dispatch events are traced.
593*38e8c45fSAndroid Build Coastguard Worker tapAndExpect({window}, Level::REDACTED, Level::NONE, s);
594*38e8c45fSAndroid Build Coastguard Worker
595*38e8c45fSAndroid Build Coastguard Worker // Notify a down event, which should be traced.
596*38e8c45fSAndroid Build Coastguard Worker const auto down = MotionArgsBuilder(ACTION_DOWN, AINPUT_SOURCE_TOUCHSCREEN)
597*38e8c45fSAndroid Build Coastguard Worker .pointer(PointerBuilder(0, ToolType::FINGER).x(100).y(110))
598*38e8c45fSAndroid Build Coastguard Worker .build();
599*38e8c45fSAndroid Build Coastguard Worker s.expectMotionTraced(Level::REDACTED, toMotionEvent(down));
600*38e8c45fSAndroid Build Coastguard Worker mDispatcher->notifyMotion(down);
601*38e8c45fSAndroid Build Coastguard Worker auto consumed = window->consumeMotionEvent(WithMotionAction(ACTION_DOWN));
602*38e8c45fSAndroid Build Coastguard Worker s.expectDispatchTraced(Level::NONE, {*consumed, window});
603*38e8c45fSAndroid Build Coastguard Worker
604*38e8c45fSAndroid Build Coastguard Worker // Force a cancel event to be synthesized. This should not be traced, because only inbound
605*38e8c45fSAndroid Build Coastguard Worker // events are requested.
606*38e8c45fSAndroid Build Coastguard Worker mDispatcher->cancelCurrentTouch();
607*38e8c45fSAndroid Build Coastguard Worker consumed = window->consumeMotionEvent(WithMotionAction(ACTION_CANCEL));
608*38e8c45fSAndroid Build Coastguard Worker s.expectMotionTraced(Level::NONE, *consumed);
609*38e8c45fSAndroid Build Coastguard Worker s.expectDispatchTraced(Level::NONE, {*consumed, window});
610*38e8c45fSAndroid Build Coastguard Worker
611*38e8c45fSAndroid Build Coastguard Worker waitForTracerIdle();
612*38e8c45fSAndroid Build Coastguard Worker }
613*38e8c45fSAndroid Build Coastguard Worker
TEST_F(InputTracingTest,TraceWindowDispatch)614*38e8c45fSAndroid Build Coastguard Worker TEST_F(InputTracingTest, TraceWindowDispatch) {
615*38e8c45fSAndroid Build Coastguard Worker InputTraceSession s{[](auto& config) {
616*38e8c45fSAndroid Build Coastguard Worker // Only trace window dispatch - don't trace event details
617*38e8c45fSAndroid Build Coastguard Worker config->set_trace_dispatcher_window_dispatch(true);
618*38e8c45fSAndroid Build Coastguard Worker config->set_mode(AndroidInputEventConfig::TRACE_MODE_USE_RULES);
619*38e8c45fSAndroid Build Coastguard Worker // Rule: Trace everything as REDACTED
620*38e8c45fSAndroid Build Coastguard Worker auto rule1 = config->add_rules();
621*38e8c45fSAndroid Build Coastguard Worker rule1->set_trace_level(AndroidInputEventConfig::TRACE_LEVEL_REDACTED);
622*38e8c45fSAndroid Build Coastguard Worker }};
623*38e8c45fSAndroid Build Coastguard Worker
624*38e8c45fSAndroid Build Coastguard Worker auto window = sp<FakeWindowHandle>::make(APP, mDispatcher, "Window", DISPLAY_ID);
625*38e8c45fSAndroid Build Coastguard Worker window->setOwnerInfo(PID, ALLOWED_UID_1);
626*38e8c45fSAndroid Build Coastguard Worker mDispatcher->onWindowInfosChanged({{*window->getInfo()}, {}, 0, 0});
627*38e8c45fSAndroid Build Coastguard Worker
628*38e8c45fSAndroid Build Coastguard Worker // Only dispatch events are traced. No inbound events are traced.
629*38e8c45fSAndroid Build Coastguard Worker tapAndExpect({window}, Level::NONE, Level::REDACTED, s);
630*38e8c45fSAndroid Build Coastguard Worker
631*38e8c45fSAndroid Build Coastguard Worker // Notify a down event; the dispatch should be traced.
632*38e8c45fSAndroid Build Coastguard Worker const auto down = MotionArgsBuilder(ACTION_DOWN, AINPUT_SOURCE_TOUCHSCREEN)
633*38e8c45fSAndroid Build Coastguard Worker .pointer(PointerBuilder(0, ToolType::FINGER).x(100).y(110))
634*38e8c45fSAndroid Build Coastguard Worker .build();
635*38e8c45fSAndroid Build Coastguard Worker s.expectMotionTraced(Level::NONE, toMotionEvent(down));
636*38e8c45fSAndroid Build Coastguard Worker mDispatcher->notifyMotion(down);
637*38e8c45fSAndroid Build Coastguard Worker auto consumed = window->consumeMotionEvent(WithMotionAction(ACTION_DOWN));
638*38e8c45fSAndroid Build Coastguard Worker s.expectDispatchTraced(Level::REDACTED, {*consumed, window});
639*38e8c45fSAndroid Build Coastguard Worker
640*38e8c45fSAndroid Build Coastguard Worker // Force a cancel event to be synthesized. All events that are dispatched should be traced.
641*38e8c45fSAndroid Build Coastguard Worker mDispatcher->cancelCurrentTouch();
642*38e8c45fSAndroid Build Coastguard Worker consumed = window->consumeMotionEvent(WithMotionAction(ACTION_CANCEL));
643*38e8c45fSAndroid Build Coastguard Worker s.expectMotionTraced(Level::NONE, *consumed);
644*38e8c45fSAndroid Build Coastguard Worker s.expectDispatchTraced(Level::REDACTED, {*consumed, window});
645*38e8c45fSAndroid Build Coastguard Worker
646*38e8c45fSAndroid Build Coastguard Worker waitForTracerIdle();
647*38e8c45fSAndroid Build Coastguard Worker }
648*38e8c45fSAndroid Build Coastguard Worker
649*38e8c45fSAndroid Build Coastguard Worker // TODO(b/336097719): Investigate flakiness and re-enable this test.
TEST_F(InputTracingTest,DISABLED_SimultaneousTracingSessions)650*38e8c45fSAndroid Build Coastguard Worker TEST_F(InputTracingTest, DISABLED_SimultaneousTracingSessions) {
651*38e8c45fSAndroid Build Coastguard Worker auto s1 = std::make_unique<InputTraceSession>(
652*38e8c45fSAndroid Build Coastguard Worker [](auto& config) { config->set_mode(AndroidInputEventConfig::TRACE_MODE_TRACE_ALL); });
653*38e8c45fSAndroid Build Coastguard Worker
654*38e8c45fSAndroid Build Coastguard Worker auto window = sp<FakeWindowHandle>::make(APP, mDispatcher, "Window", DISPLAY_ID);
655*38e8c45fSAndroid Build Coastguard Worker mDispatcher->onWindowInfosChanged({{*window->getInfo()}, {}, 0, 0});
656*38e8c45fSAndroid Build Coastguard Worker setFocusedWindow(window);
657*38e8c45fSAndroid Build Coastguard Worker window->consumeFocusEvent(true);
658*38e8c45fSAndroid Build Coastguard Worker
659*38e8c45fSAndroid Build Coastguard Worker tapAndExpect({window}, Level::COMPLETE, Level::COMPLETE, *s1);
660*38e8c45fSAndroid Build Coastguard Worker keypressAndExpect({window}, Level::COMPLETE, Level::COMPLETE, *s1);
661*38e8c45fSAndroid Build Coastguard Worker
662*38e8c45fSAndroid Build Coastguard Worker auto s2 = std::make_unique<InputTraceSession>([](auto& config) {
663*38e8c45fSAndroid Build Coastguard Worker config->set_trace_dispatcher_input_events(true);
664*38e8c45fSAndroid Build Coastguard Worker config->set_trace_dispatcher_window_dispatch(true);
665*38e8c45fSAndroid Build Coastguard Worker config->set_mode(AndroidInputEventConfig::TRACE_MODE_USE_RULES);
666*38e8c45fSAndroid Build Coastguard Worker // Rule: Trace all events as REDACTED when IME inactive
667*38e8c45fSAndroid Build Coastguard Worker auto rule = config->add_rules();
668*38e8c45fSAndroid Build Coastguard Worker rule->set_trace_level(AndroidInputEventConfig::TRACE_LEVEL_REDACTED);
669*38e8c45fSAndroid Build Coastguard Worker rule->set_match_ime_connection_active(false);
670*38e8c45fSAndroid Build Coastguard Worker });
671*38e8c45fSAndroid Build Coastguard Worker
672*38e8c45fSAndroid Build Coastguard Worker auto s3 = std::make_unique<InputTraceSession>([](auto& config) {
673*38e8c45fSAndroid Build Coastguard Worker // Only trace window dispatch
674*38e8c45fSAndroid Build Coastguard Worker config->set_trace_dispatcher_window_dispatch(true);
675*38e8c45fSAndroid Build Coastguard Worker config->set_mode(AndroidInputEventConfig::TRACE_MODE_USE_RULES);
676*38e8c45fSAndroid Build Coastguard Worker // Rule: Trace non-secure events as COMPLETE
677*38e8c45fSAndroid Build Coastguard Worker auto rule = config->add_rules();
678*38e8c45fSAndroid Build Coastguard Worker rule->set_trace_level(AndroidInputEventConfig::TRACE_LEVEL_COMPLETE);
679*38e8c45fSAndroid Build Coastguard Worker rule->set_match_secure(false);
680*38e8c45fSAndroid Build Coastguard Worker });
681*38e8c45fSAndroid Build Coastguard Worker
682*38e8c45fSAndroid Build Coastguard Worker // Down event should be recorded on all traces.
683*38e8c45fSAndroid Build Coastguard Worker const auto down = MotionArgsBuilder(ACTION_DOWN, AINPUT_SOURCE_TOUCHSCREEN)
684*38e8c45fSAndroid Build Coastguard Worker .pointer(PointerBuilder(0, ToolType::FINGER).x(100).y(110))
685*38e8c45fSAndroid Build Coastguard Worker .build();
686*38e8c45fSAndroid Build Coastguard Worker mDispatcher->notifyMotion(down);
687*38e8c45fSAndroid Build Coastguard Worker s1->expectMotionTraced(Level::COMPLETE, toMotionEvent(down));
688*38e8c45fSAndroid Build Coastguard Worker s2->expectMotionTraced(Level::REDACTED, toMotionEvent(down));
689*38e8c45fSAndroid Build Coastguard Worker s3->expectMotionTraced(Level::NONE, toMotionEvent(down));
690*38e8c45fSAndroid Build Coastguard Worker auto consumed = window->consumeMotionEvent(WithMotionAction(ACTION_DOWN));
691*38e8c45fSAndroid Build Coastguard Worker s1->expectDispatchTraced(Level::COMPLETE, {*consumed, window});
692*38e8c45fSAndroid Build Coastguard Worker s2->expectDispatchTraced(Level::REDACTED, {*consumed, window});
693*38e8c45fSAndroid Build Coastguard Worker s3->expectDispatchTraced(Level::COMPLETE, {*consumed, window});
694*38e8c45fSAndroid Build Coastguard Worker
695*38e8c45fSAndroid Build Coastguard Worker // Move event when IME is active.
696*38e8c45fSAndroid Build Coastguard Worker mDispatcher->setInputMethodConnectionIsActive(true);
697*38e8c45fSAndroid Build Coastguard Worker const auto move1 = MotionArgsBuilder(ACTION_MOVE, AINPUT_SOURCE_TOUCHSCREEN)
698*38e8c45fSAndroid Build Coastguard Worker .pointer(PointerBuilder(0, ToolType::FINGER).x(100).y(110))
699*38e8c45fSAndroid Build Coastguard Worker .build();
700*38e8c45fSAndroid Build Coastguard Worker mDispatcher->notifyMotion(move1);
701*38e8c45fSAndroid Build Coastguard Worker s1->expectMotionTraced(Level::COMPLETE, toMotionEvent(move1));
702*38e8c45fSAndroid Build Coastguard Worker s2->expectMotionTraced(Level::NONE, toMotionEvent(move1));
703*38e8c45fSAndroid Build Coastguard Worker s3->expectMotionTraced(Level::NONE, toMotionEvent(move1));
704*38e8c45fSAndroid Build Coastguard Worker consumed = window->consumeMotionEvent(WithMotionAction(ACTION_MOVE));
705*38e8c45fSAndroid Build Coastguard Worker s1->expectDispatchTraced(Level::COMPLETE, {*consumed, window});
706*38e8c45fSAndroid Build Coastguard Worker s2->expectDispatchTraced(Level::NONE, {*consumed, window});
707*38e8c45fSAndroid Build Coastguard Worker s3->expectDispatchTraced(Level::COMPLETE, {*consumed, window});
708*38e8c45fSAndroid Build Coastguard Worker
709*38e8c45fSAndroid Build Coastguard Worker // Move event after window became secure.
710*38e8c45fSAndroid Build Coastguard Worker mDispatcher->setInputMethodConnectionIsActive(false);
711*38e8c45fSAndroid Build Coastguard Worker window->setSecure(true);
712*38e8c45fSAndroid Build Coastguard Worker mDispatcher->onWindowInfosChanged({{*window->getInfo()}, {}, 0, 0});
713*38e8c45fSAndroid Build Coastguard Worker const auto move2 = MotionArgsBuilder(ACTION_MOVE, AINPUT_SOURCE_TOUCHSCREEN)
714*38e8c45fSAndroid Build Coastguard Worker .pointer(PointerBuilder(0, ToolType::FINGER).x(100).y(110))
715*38e8c45fSAndroid Build Coastguard Worker .build();
716*38e8c45fSAndroid Build Coastguard Worker mDispatcher->notifyMotion(move2);
717*38e8c45fSAndroid Build Coastguard Worker s1->expectMotionTraced(Level::COMPLETE, toMotionEvent(move2));
718*38e8c45fSAndroid Build Coastguard Worker s2->expectMotionTraced(Level::REDACTED, toMotionEvent(move2));
719*38e8c45fSAndroid Build Coastguard Worker s3->expectMotionTraced(Level::NONE, toMotionEvent(move2));
720*38e8c45fSAndroid Build Coastguard Worker consumed = window->consumeMotionEvent(WithMotionAction(ACTION_MOVE));
721*38e8c45fSAndroid Build Coastguard Worker s1->expectDispatchTraced(Level::COMPLETE, {*consumed, window});
722*38e8c45fSAndroid Build Coastguard Worker s2->expectDispatchTraced(Level::REDACTED, {*consumed, window});
723*38e8c45fSAndroid Build Coastguard Worker s3->expectDispatchTraced(Level::NONE, {*consumed, window});
724*38e8c45fSAndroid Build Coastguard Worker
725*38e8c45fSAndroid Build Coastguard Worker waitForTracerIdle();
726*38e8c45fSAndroid Build Coastguard Worker s2.reset();
727*38e8c45fSAndroid Build Coastguard Worker
728*38e8c45fSAndroid Build Coastguard Worker // Up event.
729*38e8c45fSAndroid Build Coastguard Worker window->setSecure(false);
730*38e8c45fSAndroid Build Coastguard Worker mDispatcher->onWindowInfosChanged({{*window->getInfo()}, {}, 0, 0});
731*38e8c45fSAndroid Build Coastguard Worker const auto up = MotionArgsBuilder(ACTION_UP, AINPUT_SOURCE_TOUCHSCREEN)
732*38e8c45fSAndroid Build Coastguard Worker .pointer(PointerBuilder(0, ToolType::FINGER).x(100).y(110))
733*38e8c45fSAndroid Build Coastguard Worker .build();
734*38e8c45fSAndroid Build Coastguard Worker mDispatcher->notifyMotion(up);
735*38e8c45fSAndroid Build Coastguard Worker s1->expectMotionTraced(Level::COMPLETE, toMotionEvent(up));
736*38e8c45fSAndroid Build Coastguard Worker s3->expectMotionTraced(Level::NONE, toMotionEvent(up));
737*38e8c45fSAndroid Build Coastguard Worker consumed = window->consumeMotionEvent(WithMotionAction(ACTION_UP));
738*38e8c45fSAndroid Build Coastguard Worker s1->expectDispatchTraced(Level::COMPLETE, {*consumed, window});
739*38e8c45fSAndroid Build Coastguard Worker s3->expectDispatchTraced(Level::COMPLETE, {*consumed, window});
740*38e8c45fSAndroid Build Coastguard Worker
741*38e8c45fSAndroid Build Coastguard Worker waitForTracerIdle();
742*38e8c45fSAndroid Build Coastguard Worker s3.reset();
743*38e8c45fSAndroid Build Coastguard Worker
744*38e8c45fSAndroid Build Coastguard Worker tapAndExpect({window}, Level::COMPLETE, Level::COMPLETE, *s1);
745*38e8c45fSAndroid Build Coastguard Worker keypressAndExpect({window}, Level::COMPLETE, Level::COMPLETE, *s1);
746*38e8c45fSAndroid Build Coastguard Worker
747*38e8c45fSAndroid Build Coastguard Worker waitForTracerIdle();
748*38e8c45fSAndroid Build Coastguard Worker s1.reset();
749*38e8c45fSAndroid Build Coastguard Worker }
750*38e8c45fSAndroid Build Coastguard Worker
751*38e8c45fSAndroid Build Coastguard Worker } // namespace android::inputdispatcher::trace
752